【问题标题】:Custom Authorize Filter Order Execution with ValidateAntiForgeryToken使用 ValidateAntiForgeryToken 自定义授权过滤器订单执行
【发布时间】:2013-11-01 00:00:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c# asp.net-mvc filter authorize-attribute


【解决方案1】:

过滤器执行顺序由它们的类型定义,它们的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 属性,但输入后,它终于出现了。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如何为我的自定义授权属性设置默认订单设置值,该属性基本上是扩展的。它也类似于 ValidateAntiForgeryToken 属性。我没有看到为此设置的默认顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多