17

Utworzono dwie klasy, które implementują AuthorizeAttribute.Kolejność wykonywania filtra działania

Jednym z nich jest używany na całym świecie, i ustawić go na Global.asax.cs:

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

Drugi nazywa SecondAuthorizeAttribute i jest używany tylko w niektórych metodach działania i używam go jako atrybut metody, których potrzebuję.

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

Problemem jest to, że SecondAuthorizeAttribute zawsze wykonać przed FirstAuthorizeAttribute i muszę to jedno, aby wykonać pierwszy. Zamówienie nie jest pomocne, jak mogłem to zrobić?

Odpowiedz

3

Zamówienie nie działa w pliku Global.asax.cs. Jeśli wymagane jest zamówienie, to należy uzyskać kontroler lub metodę działania i podać. np: -

[secondAttribute (kolejność = 1)] [firstAttribute (kolejność = 2)]

HomeController: Kontroler

lub

publicznego ActionResult Index()

15

Link w odpowiedzi @ HectorCorrea jest już martwy, oto treść pobrana i podsumowana z aktualnej pamięci podręcznej Google (w przypadku, które również się pojawi):

Filtry wykonać w następującej kolejności:

  • Autoryzacja filtruje
  • filtry akcji
  • filtry
  • Response/Wynik
  • filtry wyjątków

ciągu każdego filtra, można określić właściwość Order . (Wszystkie filtry pochodzą z klasy abstrakcyjnej FilterAttribute, a ta klasa ma właściwość Order). Ta właściwość zapewni, że filtr będzie działać w określonym zamówieniu.

np

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

Jest też FilterScope i domyślnie filtr o najniższym zakresie biegnie pierwszy, gdy zamówienie jest taka sama (lub nie określono):

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

Jeśli nie kolejność jest określona, ​​wartość zamówienia wynosi -1 (pierwsza, nie ostatnia).

Kontrolery same mogą być filtry i będzie działać z rzędu Int32.MinValue

+2

Należy pamiętać, że filtry wyjątków działają w odwrotnej kolejności (oczywiście, że tak!), Więc dla nich filtr o najwyższym zakresie działa najpierw – levelnis

Powiązane problemy