5

我在一个方法上使用了几个授权过滤器。

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

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

它们都是授权过滤器,所以我希望 AuthenicationFilter 在 ValidateAntiForgeryToken 过滤器之前运行。但是 ValidateAntiForgeryToken 在 Authentication 过滤器之前运行。

我知道这可以通过 Order 属性来解决。但我想知道这种行为的原因,并且我想确保它按该顺序执行(在相应的过滤器类型中 - 授权、操作..等等)。

4

2 回答 2

6

过滤器执行顺序由它们的类型、它们的Order以及最后它们的Scopes定义。

来自msdn

过滤顺序

过滤器按以下顺序运行:

  1. 授权过滤器
  2. 动作过滤器
  3. 响应过滤器
  4. 异常过滤器

例如,授权过滤器首先运行,异常过滤器最后运行。在每个过滤器类型中,Order 值指定运行顺序。在每个过滤器类型和顺序中,Scope 枚举值指定过滤器的顺序。此枚举定义了以下过滤器范围值(按它们运行的​​顺序):

  1. 第一的
  2. 全球的
  3. 控制器
  4. 最后行动

例如,Order 属性设置为零且筛选范围设置为 First 的 OnActionExecuting(ActionExecutingContext) 筛选器在 Order 属性设置为零且筛选范围设置为 Action 的操作筛选器之前运行。由于异常筛选器以相反的顺序运行,因此 Order 属性设置为零且筛选范围设置为 First 的异常筛选器在 Order 属性设置为零且筛选范围设置为 Action 的操作筛选器之后运行。

最后:

具有相同类型、顺序和范围的过滤器的执行顺序未定义。

您的ValidateAntiForgeryTokenAuthorize过滤器也具有相同的类型、顺序和范围(均未定义),因此执行顺序将未定义。如您所知,从那时起,您唯一的选择就是Order为两者定义一个属性。

供您参考,我的 Intellisense 中没有显示 FilterScope 属性,但在输入后,它终于出现了。

于 2013-10-22T22:21:36.383 回答
0

是的,您需要使用 Order 属性。

我怀疑这些属性之一没有默认的订单集。在这些情况下,默认值为 -1,因此任何未指定 Order 值的过滤器将在任何具有 Order 值的过滤器之前触发(因为 -1<0)。

于 2013-10-22T22:18:05.237 回答