フォーム認証でMVC3を使用しています。私のコントローラーまたはメソッドでは、次のことを行っています。
[Authorize (Roles = "developer")]
この場合、ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページに戻します。ただし、そのユーザーの「IsInRole」チェックでfalseが返された場合は、「認証されていません」などの別のビューに移動するようにします。
このようなことを達成するための最良の方法は何ですか?新しいAuthorization属性の作成を避けたいと思っていたので、アプリケーション全体ですべてのAuthorize属性をリファクタリングする必要はありませんでしたが、それが必要な場合は、そのルートを使用します。
HandleUnauthorizedRequest メソッドをオーバーライドするカスタム承認属性は次の作業を実行できます。
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// The user is not authenticated
base.HandleUnauthorizedRequest(filterContext);
}
else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole))
{
// The user is not in any of the listed roles =>
// show the unauthorized view
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Unauthorized.cshtml"
};
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
その後:
[MyAuthorize(Roles = "developer")]
public ActionResult Develop()
{
...
}
401ステータスコードのカスタムエラーページを使用してこれを行うこともできます。
実装の詳細については、 この質問 を参照してください。
このように使えます。権限がない場合はメソッドが来るからです。承認管理は必要ありません
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// The user is not authenticated
base.HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Unauthorized.cshtml",
};
}
}