我用几个动作过滤器装饰了我的基本控制器。他们工作正常。
其中一个过滤器会设置请求 - 例如根据域设置文化等等。
我还有一些需要使用Authorize属性进行授权的操作。
我的问题是,当用户尝试请求他们无权访问的页面时,授权过滤器会启动并将其重定向到一个页面,告诉他们无法访问该页面。
问题是操作过滤器从不运行,因此永远不会设置文化和其他请求数据。这有效地导致视图中的语言错误,并且缺少其他数据。
我知道授权过滤器首先运行,但我的问题是:我如何设计这样,以便我可以确保在返回视图之前始终运行某些方法,无论授权如何。
希望这是有道理的。
答案 0 :(得分:6)
根据此documentation(在Filter Order标头下),授权过滤器始终在Action过滤器之前运行。这意味着弄乱Order
属性无济于事。
我认为处理此问题的最佳方法是编写自己的授权属性(通过子类化AuthorizeAttribute
并覆盖AuthorizeCore
)并在授权失败时手动运行操作过滤器。
答案 1 :(得分:1)
请参阅MSDN Article on Action Filter
上的操作过滤器的执行顺序基本上,您可以在这些文化过滤器上提供Order
属性,以便在授权过滤器之前运行,如下所示:
[CultureRedirect(Order = 1)]
public class MyBaseController : Controller { }
[Authorize(Order = 2)]
public class RequiresAuth : MyBaseController { }
...
如果失败,您仍然可以 Execute code bfore an action executes ,然后才会执行任何ActionFilter。