2012-02-29 16 views
6

Ho un'azione che desidero limitare solo al ruolo "Amministratore". L'ho fatto in questo modo:Mostra pagina errore 404 dopo l'errore [Autorizza]

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

Dopo aver manualmente sotto Controller/Modifica/1 percorso che sto reindirizzato alla pagina di login. Beh, non è male forse, ma voglio mostrare 404 invece di farlo e provare ad attaccare usando gli attributi per questo. È possibile?

+3

Solo un commento, forse si dovrebbe mostrare un 401 o 403 http://en.wikipedia.org/ wiki/List_of_HTTP_status_codes # 4xx_Client_Error – Danny

+1

oh, formalmente hai ragione, ma non voglio che gli altri sappiano che il nome dell'azione è corretto (probabilmente lo suggerirebbe) – deha

+0

Credo che questo sia un duplicato di [Asp.net MVC Autorizza attributo, reindirizza alla pagina personalizzata "nessun diritto"] (http://stackoverflow.com/q/4457476/267448) –

risposta

14

È possibile?

Certo, si potrebbe scrivere un attributo di autorizzare personalizzato:

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

e poi usarlo:

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

Nota: probabilmente si desidera mostrare una pagina 401 o 403 se l'utente non è autorizzato al posto di 404 che è per file non trovato.

+0

Potrebbe essere utile per gli altri sapere che questo può essere combinato con un altro di [risposte di Darin] (http://stackoverflow.com/questions/5314673/user-is-in-role-admin-but-authorizeroles-admin- wont-authenticate). Ho fatto proprio questo e funziona brillantemente. Per combinare i due includere il metodo 'HandleUnauthorizedRequest' da questa risposta nella stessa classe del metodo' OnAuthorization' dall'altra risposta. Continua il buon lavoro Darin! – Ben

+0

@Ben puoi condividere la tua soluzione? – Daniel

+0

@Daniel Posso provare! Sono passati 2 anni da quando ho guardato questo codice, ma farò una nuova risposta tra un minuto. – Ben

1

In risposta a @ commento di Daniel sul mio commento a @ risposta di Darin questa è la mia realizzazione:

[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" 
     }; 
    } 
} 
Problemi correlati