web-dev-qa-db-ja.com

ASP.NET-ロールの承認が失敗した場合にエラーページにリダイレクトする

フォーム認証でMVC3を使用しています。私のコントローラーまたはメソッドでは、次のことを行っています。

[Authorize (Roles = "developer")]

この場合、ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページに戻します。ただし、そのユーザーの「IsInRole」チェックでfalseが返された場合は、「認証されていません」などの別のビューに移動するようにします。

このようなことを達成するための最良の方法は何ですか?新しいAuthorization属性の作成を避けたいと思っていたので、アプリケーション全体ですべてのAuthorize属性をリファクタリングする必要はありませんでしたが、それが必要な場合は、そのルートを使用します。

22
Brandon

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()
{
    ...
}
48
Darin Dimitrov

401ステータスコードのカスタムエラーページを使用してこれを行うこともできます。

実装の詳細については、 この質問 を参照してください。

1
TheCodeKing

このように使えます。権限がない場合はメソッドが来るからです。承認管理は必要ありません

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",
            };
        }
    }
1
codelover