2012-02-29 12 views
6

Tengo una acción que quiero restringir solo a la función "Admin". Lo hice así:Mostrar la página de error 404 después de [Autorizar] error

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

Después de pasar manualmente bajo Controlador/Editar ruta 1/Estoy redirigido a la página de acceso. Bueno, eso no está mal, pero quiero mostrar 404 en lugar de eso y tratar de seguir utilizando atributos para ello. ¿Es eso posible?

+3

Sólo un comentario, tal vez debería mostrar un 401 o 403 http://en.wikipedia.org/ wiki/List_of_HTTP_status_codes # 4xx_Client_Error – Danny

+1

oh, formalmente tienes razón, pero no quiero que otros sepan que el nombre de la acción es correcto (eso probablemente lo sugeriría) – deha

+0

Creo que este es un duplicado de [Asp.net MVC Authorize atributo, redirigir a la página personalizada "sin derechos"] (http://stackoverflow.com/q/4457476/267448) –

Respuesta

14

¿Es esto posible?

Claro, usted podría escribir un atributo autorizar personalizado:

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

y luego usarlo:

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

Observación: es probable que desee mostrar una página 401 o 403 si el usuario no está autorizado en lugar de 404, que es para archivo no encontrado.

+0

Puede ser útil para otros saber que esto se puede combinar con otra de las [respuestas de Darin] (http://stackoverflow.com/questions/5314673/user-is-in-role-admin-but-authorizeroles-admin- no-autenticación). He hecho exactamente eso y funciona brillantemente. Para combinar los dos, incluya el método 'HandleUnauthorizedRequest' de esta respuesta en la misma clase que el método' OnAuthorization' de la otra respuesta. Sigan con el buen trabajo Darin! – Ben

+0

@Ben ¿puedes compartir tu solución? – Daniel

+0

@Daniel Puedo intentarlo! Han pasado 2 años desde que miré este código, pero haré una nueva respuesta en un minuto. – Ben

1

En respuesta al comentario de Daniel @ en mi comentario a la respuesta de Darin @ esta es mi aplicación:

[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" 
     }; 
    } 
} 
Cuestiones relacionadas