2012-02-29 22 views
6

私はロール "Admin"に制限したいという行動があります。手動で私がログインページにリダイレクトされていますコントローラ/編集/ 1パスの下に行く後[Authorize]が失敗した後に404エラーページを表示します。

[Authorize(Roles = "Admin")] 
public ActionResult Edit(int id) 

:私はこのようにそれをやりました。まあ、それは悪くないかもしれませんが、私はそれの代わりに404を表示し、属性を使用して固執しようとします。それは可能ですか?

+3

だけのコメントは、おそらくあなたが表示されるはず401または403 http://en.wikipedia.org/ wiki/List_of_HTTP_status_codes#4xx_Client_Error – Danny

+1

ああ、正式にあなたが正しいと思うが、私は他の人にアクション名が正しいことを知らせたくない(それはおそらくそれを示唆するだろう) – deha

+0

私はこれが[Asp.net MVC Authorize属性、カスタム "no rights"ページにリダイレクトする(http://stackoverflow.com/q/4457476/267448) –

答えて

14

これは可能ですか?

あなたが属性を承認カスタムを書くことができ、確かに:その後、

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult 
     { 
      ViewName = "~/Views/Shared/401.cshtml" 
     }; 
    } 
} 

し、それを使用します。

[MyAuthorize(Roles = "Admin")] 
public ActionResult Edit(int id) 

備考:あなたはおそらくユーザーならば401や403ページを表示したいですファイルが見つからない404の代わりに許可されていません。ダーリンの答え@に私のコメントに@ダニエルさんのコメントに応えて

+0

これは、他の[Darinの回答]と組み合わせることができるということを他の人に知らせるのに役立つかもしれません(http://stackoverflow.com/questions/5314673/user-is-in-role-admin-but-authorizeroles-admin-認証されていない)。私はちょうどそれをして、それは華麗に動作します。 2つを組み合わせるには、この答えの 'HandleUnauthorizedRequest'メソッドを他の答えの' OnAuthorization'メソッドと同じクラスに含めます。ダーリンの良い仕事を続けてください! – Ben

+0

@Benあなたのソリューションを共有できますか? – Daniel

+0

@ダニエル私は試みることができます!このコードを見てから2年経ちましたが、1分後に新しい回答をします。 – Ben

1

は、この私の実装です:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 
public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     string cookieName = FormsAuthentication.FormsCookieName; 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated || 
      filterContext.HttpContext.Request.Cookies == null || 
      filterContext.HttpContext.Request.Cookies[cookieName] == null 
     ) 
     { 
      HandleUnauthorizedRequest(filterContext); 
      return; 
     } 

     var authCookie = filterContext.HttpContext.Request.Cookies[cookieName]; 
     var authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     string[] roles = authTicket.UserData.Split(','); 

     var userIdentity = new GenericIdentity(authTicket.Name); 
     var userPrincipal = new GenericPrincipal(userIdentity, roles); 

     filterContext.HttpContext.User = userPrincipal; 
     base.OnAuthorization(filterContext); 
    } 

    // Redirects unauthorized users to a "401 Unauthorized" page 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult 
     { 
      ViewName = "~/Views/Shared/Error/401.cshtml" 
     }; 
    } 
} 
関連する問題