2011-09-16 8 views
18

Estoy utilizando MVC 3 con autenticación de formularios. En mi controlador o métodos, que estoy haciendo lo siguiente:ASP.NET - Redirigir a la página de error si la autorización de roles falla

[Authorize (Roles = "developer")] 

En esta situación, quiero comprobar si el usuario está conectado y si no, devolverlos a la página de inicio de sesión. Sin embargo, si la comprobación 'IsInRole' para ese usuario devuelve falso, quiero que vaya a una vista diferente que diga algo así como 'No autorizado'.

¿Cuál es la mejor manera de lograr algo como esto? Esperaba evitar crear un nuevo atributo de Autorización para no tener que refactorizar cada atributo de Autorización en toda mi aplicación, pero si eso es lo que se requiere, iré por esa ruta.

Respuesta

44

Un atributo autorizar a medida reemplazando el método HandleUnauthorizedRequest podría hacer el trabajo:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // The user is not authenticated 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole)) 
     { 
      // The user is not in any of the listed roles => 
      // show the unauthorized view 
      filterContext.Result = new ViewResult 
      { 
       ViewName = "~/Views/Shared/Unauthorized.cshtml" 
      }; 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

y luego:

[MyAuthorize(Roles = "developer")] 
public ActionResult Develop() 
{ 
    ... 
} 
+0

Esto funcionó a la perfección. – Brandon

+0

Perfecto ... gracias ... – Shaz

+3

¿Dónde pone esta implementación personalizada? –

1

También puede hacer esto con la página de error personalizada para 401 códigos de estado.

Consulte this question para ver los detalles de implementación.

0

Puedes usarlo de esta manera. Porque si no tienes autoridad viene el método. El control de autorización no es necesario

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // The user is not authenticated 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new ViewResult 
      { 
       ViewName = "~/Views/Shared/Unauthorized.cshtml", 
      }; 
     } 
    } 
Cuestiones relacionadas