まず第一に、あなたのやり方では、あなたのアプリケーションのセキュリティに大きな穴はなく、期待通りに動作します。しかし、もっと良い方法があります...
Authorize 属性の問題は、アプリケーションに追加する新しいコントローラーを忘れがちであり、追加しないと、コントローラーが公開されてしまうことです。
MVC 4 を使用していた場合は、Authorize 属性をグローバル フィルターとして追加し、匿名コントローラーで AllowAnonymous 属性を使用できます。これは、Authorize 属性がデフォルトで AllowAnonymous 属性を尊重するためです。一方、MVC 3 には、AllowAnonymous 属性が付属していません。T
回避策は、次のようにプロジェクトで AllowAnonymous 属性を自分で作成することです。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class AllowAnonymousAttribute : Attribute { }
これで、組み込みの Authorize 属性からサブクラス化してカスタマイズし、コントローラーに適用される Anonymous 属性を探すことができます。属性が見つかった場合は、承認をスキップできます。実装例を次に示します。
public sealed class AuthorizeWithAnonymousSupportAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true);
if (!skipAuthorization)
{
base.OnAuthorization(filterContext);
}
}
}
この属性をサイトのグローバル フィルターに追加する必要があります。Global.asax で:
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new AuthorizeWithAnonymousSupportAttribute ());
filters.Add(new HandleErrorAttribute());
}
さあ、最後のステップです。匿名にしたいコントローラーに AllowAnonymous 属性を追加するだけです。
[AllowAnonymous]
public class MyController : Controller
{
public Index()
{
}
public DoStuff()
{
}
etc...
}
上記のすべてを実行する利点は、アプリケーションに追加するコントローラーに Authorize 属性を設定することを心配する必要がないことです。代わりに、どのコントローラーが公開されているかをアプリケーションに明示的に伝える必要があります。
ありがとう、これが役立つことを願っています。