5

我用几个动作过滤器装饰了我的基本控制器。他们工作正常。

其中一个过滤器设置请求 - 执行诸如基于域设置文化等事情。

我还有一些需要使用 Authorize 属性进行授权的操作。

我的问题是,当用户尝试请求他们无权访问的页面时,授权过滤器会启动并将他们重定向到一个页面,告诉他们他们无法查看该页面。

问题是操作过滤器永远不会运行,因此永远不会设置文化和其他请求数据。这有效地导致视图中的语言错误和其他数据丢失。

我知道授权过滤器首先运行,但我的问题是:我如何设计这个,以便我可以确保在返回视图之前始终运行某些方法,而不管授权如何。

希望这是有道理的。

4

2 回答 2

6

根据此文档(在过滤器顺序标题下),授权过滤器始终在操作过滤器之前运行。这意味着弄乱Order属性将无济于事。

我认为处理此问题的最佳方法是编写您自己的 Authorization 属性(通过子类化AuthorizeAttribute和覆盖AuthorizeCore)并在授权失败时手动运行您的操作过滤器。

于 2011-06-05T13:15:04.807 回答
1

请参阅MSDN 上有关操作过滤器的文章中操作过滤的执行顺序

基本上,您可以Order在这些文化过滤器上提供一个属性,以便它在授权过滤器之前运行,如下所示:

[CultureRedirect(Order = 1)]
public class MyBaseController : Controller { }

[Authorize(Order = 2)]
public class RequiresAuth : MyBaseController { }

...

如果失败,您仍然可以在操作执行之前和任何 ActionFilter 执行之前执行代码。

于 2010-03-17T03:32:14.417 回答