对未经身份验证的ASP.NET MVC请求运行授权筛选器和操作筛选器

时间:2010-03-17 03:28:29

标签: c# asp.net asp.net-mvc asp.net-membership asp.net-authorization

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

其中一个过滤器会设置请求 - 例如根据域设置文化等等。

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

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

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

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

希望这是有道理的。

2 个答案:

答案 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。