2010-12-16 14 views
31

Asp.net MVC2 redirecciona a la página de inicio de sesión con response 302 cuando el usuario autenticado no tiene derechos.Asp.net MVC Autorizar el atributo, redirigir a la página personalizada "sin derechos"

me gustaría dividir en dos acciones

  1. Si el usuario no está autenticado y luego hacer lo que hace, redirigir a la página de acceso.
  2. Si el usuario es autenticado, pero no ha requerido derechos luego regresan código de estado HTTP adecuado y no muestran ninguna página tio derechos.

¿Hay alguna manera de hacerlo? ¿O estoy haciendo algo mal con autorizar y autenticar formularios? La única forma en que puedo pensar es escribiendo el atributo de autorizar personalizado, que quiero evitar.

+2

jaja "no rights dude" page ... lol –

Respuesta

9

Puede escribir un atributo de autorizar personalizado y en el método AuthorizeCore si el usuario no está autenticado devuelva un HttpUnauthorizedResult y si está autenticado pero no en roles, realice alguna otra acción que le gustaría. Tenga en cuenta que si devuelve el código de estado 401, el marco de FormsAuthentication eventualmente lo redirigirá con 302 a la página de inicio de sesión.

+4

Pero ... solo puedes devolver un bool de AuthorizeCore. Debe invalidar OnAuthorization devolver un ActionResult –

+1

@EduardoMolteni, se podría reemplazar el método 'HandleUnauthorizedRequest' con el fin de devolver el resultado que desea. –

18

Se puede escribir de encargo atributo de filtro de esta manera:

public class CustomAuthorizeAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.HttpContext.User.Identity == null || !filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       filterContext.Result = new RedirectResult(System.Web.Security.FormsAuthentication.LoginUrl + "?returnUrl=" + 
       filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.RawUrl)); 
      } 

      //Check user right here 
      if (userNotRight) 
      { 
       filterContext.HttpContext.Response.StatusCode = 302; 
       filterContext.Result = new HttpUnauthorizedResult(); 
      } 
     } 
    } 

y utilizarlo en el controlador:

[CustomAuthorize] 
public class HomeController : Controller 
{ 

} 
+18

Debe usar AuthorizeAttribute en lugar de ActionFilterAttribute con el propósito de Autorización. – ReinierDG

+1

Sí, tienes razón. – hellangle

+0

@ReinierDG entonces, ¿cómo implementarlo con AuthorizeAttribute? – Bellash

7

Como se sugiere en Customizing authorization in ASP.NET MVC, podría subclase el AuthorizeAttribute para interceptar el-pero- autenticado escenario no autorizado y reemplazar el resultado con un redireccionamiento.

+0

Esto es mejor especialmente para autorizar los resultados en caché. –

6

Implemente un AuthorizeAttribute personalizado y agregue la siguiente anulación. Lo básico es verificar si el usuario está autenticado pero no autorizado y luego redireccionar a su propia página "Acceso denegado". ¡Espero que esto ayude!

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    base.OnAuthorization(filterContext); 

    // Check if user is authenticated and if this action requires authorization 
    if (filterContext.HttpContext.User.Identity.IsAuthenticated 
     && filterContext.ActionDescriptor.IsDefined(typeof(AuthorizeAttribute), true) 
     || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), true)) 
    { 
     List<object> attributes = new List<object>(filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), true)); 
     attributes.AddRange(filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), true)); 

     // Check all authorzation attributes 
     foreach (var attribute in attributes) 
     { 
      var authAttribute = attribute as AuthorizeAttribute; 
      if (authAttribute != null) 
      { 
       if (!filterContext.HttpContext.User.IsInRole(authAttribute.Roles)) 
       { 
        // User is not authorized so redirect to our access denied error page 
        filterContext.Result = new RedirectToRouteResult(
         new RouteValueDictionary 
          { 
           { "area", "" }, 
           { "controller", "Error" }, 
           { "action", "AccessDenied" } 
          }); 
        break; 
       } 
      } 
     } 
    } 
} 
3

similares a las soluciones sugeridas por @hellangle y @Andreas, que utiliza el código siguiente para resolver este problema:

public class CustomizedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var userAuthInfo = GetUserAuthInfo(); 

     if (!userAuthInfo.IsAuthenticated()) 
     { 
      filterContext.Result = new RedirectResult(UrlToYourLoginPage); 
      return; 
     } 

     if (!userAuthInfo.IsAuthorized()) 
     { 
      var result = new ViewResult {ViewName = "UnAuthorized"}; 
      result.ViewBag.Message = "Sorry! You are not authorized to do this!"; 
      filterContext.Result = result; 
     } 
    } 
} 

Por supuesto, es necesario implementar la clase de información de autorización de usuario y métodos relacionados (GetUserAuthInfo, IsAuthenticated, IsAuthorized) según sus necesidades específicas. Además, una vista llamada 'UnAuthorized' debe colocarse en algún lugar que el motor MVC pueda encontrar. Entonces se puede utilizar en una clase de controlador (señalado en respuesta de @ hellangle) o un método de acción:

[CustomizedAuthorizeAttribute] 
public class TargetController : Controller 
{ 
    [CustomizedAuthorizeAttribute] 
    public ActionResult TargetAction() 
    { 
     // Your Code 
    } 

} 

el fin de proporcionar diferente estrategia de control de acceso para diferentes clases de controlador y métodos de acción, implementa un constructor para CustomizedAuthorizeAttribute clase que acepta los parámetros que representan la información de control de acceso y luego instanciar la clase CustomizedAuthorizeAttribute en consecuencia.

Cuestiones relacionadas