2010-01-15 10 views
34

Tengo un controlador decorado con un AuthorizeAttribute. El controlador contiene varias acciones que requieren autenticación, aparte de una acción que requiere alguna autenticación personalizada proporcionada por CustomAuthorizeAttribute.Overriding controller AuthorizeAttribute para una sola acción

Mi pregunta es cuando agregué [Authorize] en el nivel del controlador ¿puedo anularlo (o eliminarlo) con [CustomAuthorize] en una sola acción? ¿O debo eliminar [Authorize] del nivel del controlador y agregarlo individualmente a cada otra acción?

Estoy pidiendo puramente por conveniencia porque soy flojo y no quiero decorar cada acción con AuthorizeAttribute.

[Authorize] 
public class MyController : Controller { 

    //requires authentication 
    public ViewResult Admin() { 
    return View(); 
    } 

    //... a lot more actions requiring authentication 

    //requires custom authentication 
    [CustomAuthorize] //never invoked as already failed at controller level 
    public ViewResult Home() { 
    return View(); 
    } 

} 

Respuesta

17

Usted puede cambiar el orden en el que se ejecutan los atributos (con la propiedad de la orden), pero creo que en este caso serán siendo ambos funcionan a menos que uno genera un resultado con efecto inmediato. La clave es tener el atributo menos restrictivo aplicado en el nivel más alto (clase) y ser más restrictivo para los métodos. Si desea que la acción Home esté a disposición del público, por ejemplo, deberá eliminar el atributo Autorizar de la clase y aplicarlo a cada uno de los otros métodos.

Si la acción tiene el mismo nivel de permisividad, pero tiene un resultado diferente, puede ser suficiente cambiar el orden. Por ejemplo, normalmente redirigiría a la acción Logon, pero para Home desea redirigir a la acción About. En este caso, otorgue el atributo de clase Order=2 y el atributo de acción HomeOrder=1.

+0

En este caso el CustomAuthorizeAttribute proporciona el mismo nivel de acceso, pero se utiliza para compensar un error con flash y así establecer el orden propiedades es suficiente para lograr el resultado deseado. Gracias. –

+0

Al hacer el orden del atributo en la Acción, pude anular el atributo en el Controlador. ¡Voto! –

12

Después de mucho tiempo, se me ocurrió una solución. Necesita decorar su controlador con un AuthorizeAttribute personalizado.

public class OverridableAuthorize : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var action = filterContext.ActionDescriptor; 
     if(action.IsDefined(typeof(IgnoreAuthorization), true)) return; 

     var controller = action.ControllerDescriptor; 
     if(controller.IsDefined(typeof(IgnoreAuthorization), true)) return; 

     base.OnAuthorization(filterContext); 
    } 
} 

Cuál puede ser emparejado con IgnoreAuthorization en una acción

public class IgnoreAuthorization : Attribute 
{ 
} 
+3

'IgnoreAuthorization'? ¿Quieres decir 'AllowAnonymous'? – AgentFire

+0

'AllowAnonymous' es lo que necesitaba. Gracias, @agentfire –

+0

Sí, iba a decir que la lógica exacta ya está incorporada en el método OnAuthorization de AuthorizeAttribute ... excepto que el atributo que está buscando es AllowAnonymous. Sin embargo, esta es una gran ilustración de cómo puede anular la lógica rígida "Y" que normalmente aplica. Con esto, puede aplicar un atributo de tipo FancyAuthorizeAttribute al controlador con un conjunto de parámetros, y luego también aplicarlo a un único método de controlador con diferentes parámetros, y OnAuthorization detectará el atributo de nivel de acción y omitirá el nivel de controlador. uno. – Triynko

66

En MVC 5 puede anular la autorización para cualquier acción utilizando el nuevo atributo OverrideAuthorization. Básicamente, lo agrega a una acción que tiene una configuración de autorización diferente a la definida en el controlador.

lo haces de esta manera:

[OverrideAuthorization] 
[Authorize(Roles = "Employee")] 
public ActionResult List() { ... } 

Más información en http://www.c-sharpcorner.com/UploadFile/ff2f08/filter-overrides-in-Asp-Net-mvc-5/

+3

Perfecto, ¡justo lo que se necesitaba! – user1477388

+0

Tenga en cuenta que esto también suprime los filtros de autenticación global. Todos los filtros globales que implementan IAuthorizationFilter se desactivarán. – ajbeaven

+0

cualquier alternativa en asp.net core? – shashwat

Cuestiones relacionadas