2013-10-22 16 views
5

Sto utilizzando un paio di filtri di autorizzazione su un metodo.Esecuzione ordine di filtro personalizzato di autorizzazione con ValidateAntiForgeryToken

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

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

Entrambi sono autorizzare filtro, quindi mi aspettavo AuthenicationFilter da eseguire prima del filtro ValidateAntiForgeryToken. Ma ValidateAntiForgeryToken viene eseguito prima del filtro di autenticazione.

So che questo può essere risolto dalla proprietà dell'ordine. Ma voglio sapere la ragione di questo comportamento, e voglio assicurarmi che venga eseguito in questo ordine (all'interno dei tipi di filtro corrispondenti: autorizza, azione..so su).

+1

Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

risposta

0

Sì, è necessario utilizzare la proprietà dell'ordine.

Sospetto che uno di questi attributi non abbia l'ordine predefinito impostato. In questi casi il valore predefinito è -1, quindi qualsiasi filtro che non specifica un valore Ordine verrà attivato prima di qualsiasi filtro che ha un valore Ordine (perché -1 < 0).

+0

Come faccio a impostare il valore predefinito del set di ordini per il mio attributo di autorizzazione personalizzato che è sostanzialmente esteso. È anche simile all'attributo ValidateAntiForgeryToken. Non vedo che l'ordine predefinito sia impostato per quello. – DarkKnight

6

L'ordine di esecuzione del filtro è definito dai relativi tipi, Order e infine Scopes.

Da msdn:

Ordine del filtro

Filtri eseguiti nel seguente ordine:

  1. filtri di autorizzazione
  2. filtri di azione
  3. filtri di risposta
  4. Filtri di eccezione

Ad esempio, i filtri di autorizzazione vengono eseguiti per primi e i filtri di eccezione vengono eseguiti per ultimi. All'interno di ciascun tipo di filtro, il valore dell'ordine specifica l'ordine di esecuzione. All'interno di ciascun tipo di filtro e ordine, il valore di enumerazione dell'ambito specifica l'ordine dei filtri. Questa enumerazione definisce i seguenti valori di filtro portata (nell'ordine in cui essi corrono):

  1. Prima
  2. globale
  3. controller
  4. azione Ultimo

Per esempio, un OnActionExecuting (Filtro ActionExecutingContext) che ha la proprietà Order impostata su zero e l'ambito del filtro impostato su First runs prima di un filtro di azione con la proprietà Order impostata su zero e l'ambito del filtro impostato su Action. Poiché i filtri delle eccezioni vengono eseguiti in ordine inverso, un filtro di eccezione con la proprietà Ordine impostata su zero e l'insieme di filtri impostato su Primo viene eseguito dopo un filtro di azione con la proprietà Ordine impostata su zero e l'ambito del filtro impostato su Azione.

E infine:

L'ordine di esecuzione dei filtri che hanno lo stesso tipo, ordine e portata è indefinito.

per i ValidateAntiForgeryToken e Authorize filtri sono dello stesso tipo, ordine e la portata troppo (entrambi essendo definito) per cui l'ordine di esecuzione sarà indefinito. Da quel momento, la tua unica opzione è, come già sai, definire una proprietà Order per entrambi.

Per vostra informazione, la proprietà FilterScope non viene visualizzata nel mio Intellisense ma dopo averlo digitato, appare infine.

Problemi correlati