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

时间:2013-10-22 22:13:26

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

过滤器执行顺序由其类型,Order以及最终Scopes定义。

来自msdn

过滤订单

过滤器按以下顺序运行:

  1. 授权过滤器
  2. 操作过滤器
  3. 响应过滤器
  4. 例外过滤器
  5. 例如,授权过滤器首先运行,异常过滤器最后运行。在每个过滤器类型中,Order值指定运行顺序。在每个过滤器类型和顺序中,Scope枚举值指定过滤器的顺序。此枚举定义以下过滤器范围值(按其运行顺序):

    1. 第一
    2. 全局
    3. 控制器
    4. 行动最后
    5. 例如,将Order属性设置为零并将过滤器范围设置为First的OnActionExecuting(ActionExecutingContext)过滤器在将Order属性设置为零并将过滤器范围设置为Action的操作过滤器之前运行。由于异常过滤器以相反的顺序运行,因此将Order属性设置为零并将过滤器范围设置为First的异常过滤器在将Order属性设置为零并将过滤器范围设置为Action的操作过滤器之后运行。

      最后:

        

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

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

      为了您的信息,FilterScope属性不会显示在我的智能感知中,但在输入之后,它最终会出现。

答案 1 :(得分:0)

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

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