17

He creado dos clases que implementan AuthorizeAttribute.Orden de ejecución del filtro de acción

Uno se utiliza en todo el mundo, y me puso en la Global.asax.cs:

filters.Add(new FirstAuthorizeAttribute() { Order = 0 }); 

El otro se llama SecondAuthorizeAttribute y se utiliza sólo en algunos métodos de acción, y lo uso como atributo en los métodos que quiero

[HttpGet] 
    [SecondAuthorize] 
    public ActionResult LogOut() 
    { 
     FormsAuthentication.SignOut(); 
     Session.Clear(); 
     Session.Abandon(); 
     return Redirect(Url.Content("~/")); 
    } 

El problema es que siempre se ejecutará antes de SecondAuthorizeAttributeFirstAuthorizeAttribute, y necesito éste para ejecutar en primer lugar. La orden no es útil, ¿cómo podría hacerlo?

Respuesta

3

Orden no está trabajando en el archivo global.asax.cs. Si el pedido es obligatorio, registre el controlador o el método de acción y proporcione. ex: -

[secondAttribute (orden = 1)] [firstAttribute (orden = 2)]

HomeController: Controller

o

Índice ActionResult público()

15

El enlace en la respuesta de @ HectorCorrea está muerto en este momento, aquí está el contenido recuperado y resumido de la memoria caché actual de Google (en caso de que eso también suceda):

Filtros ejecutan en este orden:

  • Autorización filtros
  • filtros de acción
  • filtros
  • Respuesta/Resultados
  • Filtros de excepción

Dentro de cada filtro, es posible especificar la propiedad Solicitar . (Todos los filtros se derivan de la clase abstracta FilterAttribute, y esta clase tiene una propiedad Order). Esta propiedad asegurará que el filtro se ejecute en un Pedido específico.

por ejemplo:

[AuthorizationFilterA(Order=2)] 
[AuthorizationFilterB(Order=1)] 
public ActionResult Index() 
{   
    return View(); 
} 

También hay FilterScope y, por defecto, el filtro con el alcance más bajo se ejecuta en primer lugar cuando el orden es el mismo (o no se especifica):

namespace System.Web.Mvc { 
    public enum FilterScope { 
     First = 0, 
     Global = 10, 
     Controller = 20, 
     Action = 30, 
     Last = 100, 
    } 
} 

Si no orden se especifica, el valor del pedido es -1 (primero, no último).

Controladores sí pueden ser los filtros y se ejecutará con el fin Int32.MinValue

+2

Tenga en cuenta que los filtros de excepción se ejecutan en orden inverso (¡por supuesto que sí!), Por lo que para ellos, el filtro con el mayor alcance se ejecuta primero – levelnis

Cuestiones relacionadas