自定义授权过滤器订单执行与验证防伪令牌

本文关键字:验证 令牌 执行 过滤器 授权 单执行 自定义 | 更新日期: 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 :

筛选顺序

筛选器按以下顺序运行:

  1. 授权筛选器
  2. 操作筛选器
  3. 响应筛选器
  4. 异常筛选器

例如,授权筛选器首先运行,异常筛选器最后运行。在每种筛选器类型中,"订单"值指定运行顺序。在每个筛选器类型和顺序中,"范围枚举"值指定筛选器的顺序。此枚举定义以下筛选器范围值(按其运行顺序):

  1. 第一
  2. 全球
  3. 控制器
  4. 最后操作

例如,将"订单"属性设置为零且筛选器范围设置为"首先"的 OnActionExecuting(ActionExecutingContext) 筛选器在将"顺序"属性设置为零且筛选器范围设置为"操作"的操作筛选器之前运行。由于异常筛选器以相反的顺序运行,因此 Order 属性设置为零且筛选器范围设置为"第一个"的异常筛选器在 Order 属性设置为零且筛选器范围设置为"操作"的操作筛选器之后运行。

最后:

具有相同类型、顺序和 范围未定义。

您的验证防伪令牌和授权过滤器的类型、顺序和范围也相同(两者都未定义),因此执行顺序将是未定义的。从那时起,如您所知,您唯一的选择是为两者定义一个Order属性。

供您参考,FilterScope 属性不会显示在我的智能感知中,但在键入它后,它最终出现。

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

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