【问题标题】:Run both Authorize Filter and Action Filter on unauthenticated ASP.NET MVC request对未经身份验证的 ASP.NET MVC 请求运行授权筛选器和操作筛选器
【发布时间】:2011-06-05 21:15:04
【问题描述】:

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

其中一个过滤器设置请求 - 执行诸如根据域设置文化等操作。

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

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

问题在于操作过滤器从不运行,因此从不设置文化和其他请求数据。这实际上会导致视图中的语言错误以及其他数据丢失。

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

希望这是有道理的。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。后来我发现了这一点,最终还是按照你的建议做了。
    【解决方案2】:

    参见MSDN Article on Action Filter上的操作过滤器的执行顺序

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

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

    ...

    如果失败,您仍然可以在任何 ActionFilter 执行之前Execute code bfore an action executes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2023-04-10
      • 2019-07-29
      • 2014-06-30
      • 2015-02-23
      • 2017-08-06
      • 2021-10-28
      相关资源
      最近更新 更多