2013-10-22 28 views
5

我使用的幾個授權上的方法進行篩選。自定義授權篩選訂單執行與ValidateAntiForgeryToken

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

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

他們兩人都是授權過濾器,所以我預計AuthenicationFilter的ValidateAntiForgeryToken過濾器之前運行。但是ValidateAntiForgeryToken在認證過濾器之前運行。

我知道,這可以通過Order屬性來解決。但是我想知道這種行爲的原因,並且我想確保它按照該順序執行(在相應的過濾器類型中 - authorize,action..so on)。

+1

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

是的,你需要使用Order屬性。

我懷疑這些屬性中的一個不具有默認順序設置。在這些情況下,默認值爲-1,因此任何未指定Order值的過濾器都將在具有Order值的任何過濾器之前觸發(因爲-1 < 0)。

+0

如何爲基本擴展的自定義授權屬性設置默認訂單設置值。它也與ValidateAntiForgeryToken屬性類似。我沒有看到爲此設置的默認順序。 – DarkKnight

6

濾波器執行順序由他們的類型,它們的Order最後其Scopes限定。

msdn

濾波器階

過濾器在下面的順序運行:

  1. 授權過濾器
  2. 行動過濾器
  3. 響應濾波器
  4. 例外過濾器

例如,授權過濾器首先運行,異常過濾器最後運行。在每個過濾器類型中,Order值指定運行順序。在每個過濾器類型和順序中,範圍枚舉值指定過濾器的順序。該枚舉定義瞭如下濾波器的範圍值(按順序在它們運行):

  1. 首先
  2. 全球
  3. 控制器
  4. 行動最後

例如,OnActionExecuting(將Order屬性設置爲零且篩選器作用域設置爲First的ActionExecutingContext)篩選器在將Order屬性設置爲零且篩選器作用域設置爲Action的操作篩選器之前運行。因爲異常過濾器以相反順序運行,所以Order屬性設置爲零並且過濾器範圍設置爲First的異常過濾器在Order屬性設置爲零並且過濾器範圍設置爲Action的操作過濾器之後運行。

最後:

的具有相同類型,階濾波器執行順序,和 範圍是不確定的。

ValidateAntiForgeryTokenAuthorize濾波器是相同的類型,順序和範圍的太(都是未定義的),這樣的執行順序是不確定的。從那以後,你只能選擇爲兩者定義一個Order屬性。

有關您的信息,FilterScope屬性不會顯示在我的Intellisense中,但輸入後它終於出現。