我在方法上使用了几个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)。
答案 0 :(得分:6)
过滤器执行顺序由其类型,Order以及最终Scopes定义。
来自msdn:
过滤订单
过滤器按以下顺序运行:
例如,授权过滤器首先运行,异常过滤器最后运行。在每个过滤器类型中,Order值指定运行顺序。在每个过滤器类型和顺序中,Scope枚举值指定过滤器的顺序。此枚举定义以下过滤器范围值(按其运行顺序):
例如,将Order属性设置为零并将过滤器范围设置为First的OnActionExecuting(ActionExecutingContext)过滤器在将Order属性设置为零并将过滤器范围设置为Action的操作过滤器之前运行。由于异常过滤器以相反的顺序运行,因此将Order属性设置为零并将过滤器范围设置为First的异常过滤器在将Order属性设置为零并将过滤器范围设置为Action的操作过滤器之后运行。
最后:
具有相同类型,顺序和的过滤器的执行顺序 范围未定义。
您的ValidateAntiForgeryToken和Authorize过滤器具有相同的类型,顺序和范围(两者都未定义),因此执行顺序将是未定义的。从那时起,您唯一的选择就是为两者定义Order
属性。
为了您的信息,FilterScope属性不会显示在我的智能感知中,但在输入之后,它最终会出现。
答案 1 :(得分:0)
是的,您需要使用Order属性。
我怀疑其中一个属性没有默认的订单集。在这些情况下,默认值为-1,因此任何未指定Order值的过滤器将在具有Order值的任何过滤器之前触发(因为-1 <0)。