自定义授权过滤器订单执行与验证防伪令牌
本文关键字:验证 令牌 执行 过滤器 授权 单执行 自定义 | 更新日期: 2023-09-27 18:36:39
我正在一个方法上使用几个授权过滤器。
[SessionState(SessionStateBehavior.Required)]
public class AuthenticationFilterAttribute : AuthorizeAttribute {}
[HttpPost]
[AuthenticationFilter]
[ValidateAntiForgeryToken]
public void SaveProgress(string data) {}
它们都是授权过滤器,因此我希望AuthenicationFilter在ValidateAntiForgeryToken过滤器之前运行。但是 ValidateAntiForgeryToken 在身份验证筛选器之前运行。
我知道这可以通过 Order 属性来解决。但是我想知道这种行为的原因,我想确保它按该顺序执行(在相应的过滤器类型内 - 授权,操作。依此类推)。
过滤器执行顺序由它们的类型、顺序和最终的作用域定义。
从 msdn :
筛选顺序
筛选器按以下顺序运行:
- 授权筛选器
- 操作筛选器
- 响应筛选器
- 异常筛选器
例如,授权筛选器首先运行,异常筛选器最后运行。在每种筛选器类型中,"订单"值指定运行顺序。在每个筛选器类型和顺序中,"范围枚举"值指定筛选器的顺序。此枚举定义以下筛选器范围值(按其运行顺序):
- 第一
- 全球
- 控制器
- 最后操作
例如,将"订单"属性设置为零且筛选器范围设置为"首先"的 OnActionExecuting(ActionExecutingContext) 筛选器在将"顺序"属性设置为零且筛选器范围设置为"操作"的操作筛选器之前运行。由于异常筛选器以相反的顺序运行,因此 Order 属性设置为零且筛选器范围设置为"第一个"的异常筛选器在 Order 属性设置为零且筛选器范围设置为"操作"的操作筛选器之后运行。
最后:
具有相同类型、顺序和 范围未定义。
您的验证防伪令牌和授权过滤器的类型、顺序和范围也相同(两者都未定义),因此执行顺序将是未定义的。从那时起,如您所知,您唯一的选择是为两者定义一个Order
属性。
供您参考,FilterScope 属性不会显示在我的智能感知中,但在键入它后,它最终出现。
是的,您需要使用 Order 属性。
我怀疑这些属性之一没有设置默认订单。 在这些情况下,默认值为 -1,因此任何未指定 Order 值的筛选器都将在具有 Order 值的任何筛选器之前触发(因为 -1<0)。