Dar*_*ght 5 c# asp.net-mvc filter authorize-attribute
我在一个方法上使用了几个Authorize Filter.
[SessionState(SessionStateBehavior.Required)]
public class AuthenticationFilterAttribute : AuthorizeAttribute {}
[HttpPost]
[AuthenticationFilter]
[ValidateAntiForgeryToken]
public void SaveProgress(string data) {}
Run Code Online (Sandbox Code Playgroud)
它们都是授权过滤器,所以我希望AuthenicationFilter在ValidateAntiForgeryToken过滤器之前运行.但ValidateAntiForgeryToken在身份验证过滤器之前运行.
我知道这可以通过Order属性来解决.但我想知道这种行为的原因,并且我想确保它以该顺序执行(在相应的过滤器类型中 - authorize,action..so on).
来自msdn:
过滤顺序
过滤器按以下顺序运行:
例如,授权过滤器首先运行,异常过滤器最后运行.在每个过滤器类型中,Order值指定运行顺序.在每个过滤器类型和顺序中,Scope枚举值指定过滤器的顺序.此枚举定义以下过滤器作用域值(按其运行顺序):
例如,将Order属性设置为零并将过滤器范围设置为First的OnActionExecuting(ActionExecutingContext)过滤器在将Order属性设置为零并将过滤器范围设置为Action的操作过滤器之前运行.由于异常过滤器以相反的顺序运行,因此将Order属性设置为零并将过滤器范围设置为First的异常过滤器在将Order属性设置为零并将过滤器范围设置为Action的操作过滤器之后运行.
最后:
未定义具有相同类型,顺序和范围的过滤器的执行顺序.
您的ValidateAntiForgeryToken和Authorize过滤器具有相同的类型,顺序和范围(均未定义),因此执行顺序将是未定义的.从那时起,您唯一的选择是,如您所知,Order为两者定义属性.
为了您的信息,FilterScope属性不会显示在我的Intellisense中,但在输入后,它最终会出现.
是的,您需要使用 Order 属性。
我怀疑这些属性之一没有设置默认的顺序。在这些情况下,默认值为 -1,因此任何未指定 Order 值的过滤器都将在任何具有 Order 值的过滤器之前触发(因为 -1<0)。
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |