2013-10-22 7 views
5

メソッドでAuthorize Filterを使用しています。ValidateAntiForgeryTokenを使用したカスタムオーソライズフィルタの実行

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

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

それらの両方は、フィルタを認可されているので、私はValidateAntiForgeryTokenフィルタの前に実行するようにAuthenicationFilterを期待しました。しかし、ValidateAntiForgeryTokenは認証フィルターの前に実行されます。

これは、Orderプロパティで解決できます。しかし、私はこの振る舞いの理由を知りたいのですが、その順番で確実に実行したいと考えています(対応するフィルタタイプ - authorize、action ... so)。

+1

タイトルを編集しました。 「[質問には「タイトル内に「タグ」を含める必要がありますか」(http://meta.stackexchange.com/questions/19190/)」を参照してください。コンセンサスは「いいえ、そうすべきではありません」です。 –

答えて

0

はい、Orderプロパティを使用する必要があります。

これらの属性のいずれかにデフォルトのOrderが設定されていないと思われます。このような場合、デフォルト値は-1です。したがって、Order値を指定しないフィルタは、Order値を持つフィルタ(-0なので)の前に起動します。

+0

基本的に拡張されたカスタム権限属性のデフォルトの注文セット値を設定するにはどうすればよいですか。また、ValidateAntiForgeryToken属性と同様です。私はそれのために設定されたデフォルトの順序を見ていない。 – DarkKnight

6

フィルタの実行順序は、そのタイプによって定義されます(Order、最後にはScopes)。

msdnから:

フィルタの順序

フィルタは次の順序で実行します。

  1. 認証フィルタを
  2. アクションフィルタ
  3. 応答フィルタ
  4. 例外フィルタ

たとえば、承認フィルタが最初に実行され、例外フィルタが最後に実行されます。各フィルタタイプ内で、Order値は実行順序を指定します。スコープ列挙値は、各フィルタの種類と順序内で、フィルタの順序を指定します。例えば

  1. まず
  2. グローバルコントローラ
  3. アクション最終

、OnActionExecuting(この列挙は、以下のフィルタスコープ値(それらが実行順序で)を定義しますActionプロパティが0に設定され、フィルタスコープがFirstに設定されているActionExecutingContext)フィルタは、Orderプロパティが0に設定され、フィルタスコープがActionに設定されているアクションフィルタの前に実行されます。例外フィルタは逆の順序で実行されるため、Orderプロパティが0に設定され、フィルタスコープがFirstに設定された例外フィルタは、Orderプロパティが0に設定され、フィルタスコープがActionに設定されたアクションフィルタの後に実行されます。

そして最後に:

同じ種類、順序を持つフィルタの実行順序、および 範囲が定義されていません。

あなたValidateAntiForgeryTokenAuthorizeフィルタは、あまりにも、同じ種類、順序と範囲である(両方とも未定義である)ので、実行順序が定義されません。それ以来、唯一の選択肢は、すでに知っているように、両方に対してOrderプロパティを定義することです。

あなたの情報として、FilterScopeプロパティはIntellisenseに表示されませんが、入力後に最終的に表示されます。

関連する問題