使用ValidateAntiForgeryToken自定义授权过滤器订单执行

Dar*_*ght 5 c# asp.net-mvc filter authorize-attribute

我在一个方法上使用了几个Authorize Filter.

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

[HttpPost]
[AuthenticationFilter]
[ValidateAntiForgeryToken]
public void SaveProgress(string data) {}
Run Code Online (Sandbox Code Playgroud)

它们都是授权过滤器,所以我希望AuthenicationFilter在ValidateAntiForgeryToken过滤器之前运行.但ValidateAntiForgeryToken在身份验证过滤器之前运行.

我知道这可以通过Order属性来解决.但我想知道这种行为的原因,并且我想确保它以该顺序执行(在相应的过滤器类型中 - authorize,action..so on).

Air*_*irL 6

过滤器执行顺序由其类型,订单和最终的范围定义.

来自msdn:

过滤顺序

过滤器按以下顺序运行:

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

例如,授权过滤器首先运行,异常过滤器最后运行.在每个过滤器类型中,Order值指定运行顺序.在每个过滤器类型和顺序中,Scope枚举值指定过滤器的顺序.此枚举定义以下过滤器作用域值(按其运行顺序):

  1. 第一
  2. 全球
  3. 调节器
  4. 行动最后

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

最后:

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

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

为了您的信息,FilterScope属性不会显示在我的Intellisense中,但在输入后,它最终会出现.


may*_*lle 0

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

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