2013-10-22 11 views
5

Używam kilku filtrów autoryzacji dla metody.Custom Autoryzuj Filtr Wykonaj zlecenie z ValidateAntiForgeryToken

[SessionState(SessionStateBehavior.Required)] 
public class AuthenticationFilterAttribute : AuthorizeAttribute {} 

[HttpPost] 
[AuthenticationFilter] 
[ValidateAntiForgeryToken] 
public void SaveProgress(string data) {} 

Obaj są autoryzacji filtr, więc spodziewałem AuthenicationFilter biec przed filtrem ValidateAntiForgeryToken. Ale ValidateAntiForgeryToken działa przed filtrem Uwierzytelniania.

Wiem, że można to rozwiązać za pomocą nieruchomości Order. Ale chcę poznać przyczynę tego zachowania i chcę się upewnić, że jest wykonywana w tej kolejności (w odpowiednich typach filtrów - autoryzacja, akcja itd.).

+1

Zmieniłem twój tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –

Odpowiedz

0

Tak, musisz użyć właściwości Zamów.

Podejrzewam, że jeden z tych atrybutów nie ma domyślnego zestawu zamówień. W tych przypadkach wartością domyślną jest -1, więc każdy filtr, który nie określa wartości zamówienia, zostanie uruchomiony przed każdym filtrem, który ma wartość zamówienia (ponieważ -1 < 0).

+0

Jak ustawić domyślną wartość zestawu zamówień dla mojego niestandardowego atrybutu autoryzacji, który jest zasadniczo rozszerzony. Jest również podobny do atrybutu ValidateAntiForgeryToken. Nie widzę dla tego ustawionej domyślnej kolejności. – DarkKnight

6

Kolejność wykonywania filtrów jest zdefiniowana według ich typów, ich Order i wreszcie ich Scopes.

Od msdn:

Filtr Kolejność

Filtry uruchamiane w następującej kolejności:

  1. filtry autoryzacji
  2. filtry akcji
  3. filtry Response
  4. Filtry wyjątków

Na przykład filtry autoryzacji są uruchamiane jako pierwsze, a filtry wyjątków - jako ostatnie. W każdym typie filtru wartość Order określa kolejność wykonywania. W każdym typie i kolejności filtrów wartość wyliczenia zakresu określa kolejność filtrów. To wyliczenie określa następujące wartości filtra Zakres (w takiej kolejności, w jakiej RUN):

  1. Pierwszy
  2. Globalny
  3. Controller
  4. ostatniej akcji

Na przykład OnActionExecuting (ActionExecutingContext), w którym właściwość Order jest ustawiona na zero, a zakres filtru ustawiony na Pierwsze uruchomienia przed filtrem działań, dla którego właściwość Order jest ustawiona na zero, a zakres filtru na Action. Ponieważ filtry wyjątków działają w odwrotnej kolejności, filtr wyjątków, który ma ustawioną właściwość Order na zero i zakres filtru ustawiony na Pierwszy uruchamia się po filtrze akcji, który ma ustawioną właściwość Order na zero i zakres filtru ustawiony na działanie.

I wreszcie:

kolejność wykonywania filtrów, które mają ten sam typ, porządek i zakres jest niezdefiniowany.

Twoje ValidateAntiForgeryToken i Authorize filtry są tego samego rodzaju, kolejności i zakresu zbyt (zarówno jako niezdefiniowany), więc kolejność wykonywania będą niezdefiniowane. Od tego momentu jedyną opcją jest, jak już wiesz, zdefiniowanie dla obu właściwości Order.

Dla twojej informacji właściwość FilterScope nie pojawia się w moim IntelliSense, ale po jej wpisaniu w końcu się pojawia.

Powiązane problemy