2012-02-29 15 views
6

Mam działanie, które chcę ograniczyć tylko do roli "Administrator". Zrobiłem to w ten sposób:Pokaż stronę błędu 404 po błędzie [Autoryzuj]

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

Po ręcznym przejściu pod ścieżką Controller/Edit/1 zostaje przekierowany do strony logowania. Cóż, to nie jest złe, ale chcę pokazać 404 zamiast tego i próbować trzymać za to atrybuty. Czy to jest możliwe?

+3

Tylko uwaga, być może warto pokazać 401 lub 403 http://en.wikipedia.org/ wiki/List_of_HTTP_status_codes # 4xx_Client_Error – Danny

+1

O, formalnie masz rację, ale nie chcę, żeby inni wiedzieli, że nazwa akcji jest poprawna (prawdopodobnie by to sugerowało) – deha

+0

Wierzę, że jest to duplikat [Asp.net MVC Authorize atrybut, przekierowanie do niestandardowej strony "brak praw"] (http://stackoverflow.com/q/4457476/267448) –

Odpowiedz

14

Czy to możliwe?

Oczywiście, można napisać niestandardowy atrybut zezwolić na:

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

a następnie użyć go:

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

uwaga: prawdopodobnie chcesz, aby pokazać 401 lub 403 stron, jeśli użytkownik nie jest autoryzowany zamiast 404, którego nie znaleziono.

+0

Może być pomocne dla innych, aby wiedzieć, że może to być połączone z innym z [odpowiedzi Darina] (http://stackoverflow.com/questions/5314673/user-is-in-role-admin-but-authorizeroles-admin- wont-authenticate). Właśnie to zrobiłem i działa znakomicie. Aby połączyć te dwie metody, należy użyć metody "HandleUnauthorizedRequest" z tej odpowiedzi w tej samej klasie, co metoda "OnAuthorization" z drugiej odpowiedzi. Kontynuuj dobrą pracę Darin! – Ben

+0

@Ben możesz podzielić się swoim rozwiązaniem? – Daniel

+0

@Daniel Mogę spróbować! Minęły dwa lata, odkąd spojrzałem na ten kod, ale za chwilę zrobię nową odpowiedź. – Ben

1

W odpowiedzi na @ komentarzu Daniela w moim komentarzu do odpowiedzi @ Darin jest to moja realizacja:

[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" 
     }; 
    } 
} 
Powiązane problemy