2012-02-29 3 views
6

조치 "Admin"역할로만 제한하려고합니다. 나는 이것을 다음과 같이했다 :[Authorize] 실패 후 404 오류 페이지 표시

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

수동으로 컨트롤러/편집/1 경로 아래로 이동 한 후 로그인 페이지로 리디렉션됩니다. 글쎄, 그건 나쁘지 않을 수도 있지만, 대신에 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 특성, 사용자 지정 "권한 없음 페이지"(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- 못해 - 인증). 나는 그 일을 훌륭하게 해냈다. 두 응답을 결합하려면 다른 응답의'OnAuthorization' 메소드와 같은 클래스에있는이 응답의'HandleUnauthorizedRequest' 메소드를 포함하십시오. 대린을 잘 지켜라! – Ben

+0

@Ben으로 솔루션을 공유 할 수 있습니까? – Daniel

+0

@ 대니얼 시도 할 수 있습니다! 이 코드를 살펴본 지 2 년이되었지만 잠시 후에 새로운 대답을 드리겠습니다. – 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" 
     }; 
    } 
}