【问题标题】:Execution order against authorization filter针对授权过滤器的执行顺序
【发布时间】:2013-03-19 22:10:15
【问题描述】:

使用 Fluent Security,我已经使用 DenyAnonymousAccess、DenyAuthenticationAccess 和 RequireRole 配置了网站访问。但是,由于HandleSecurityAttribute不是授权过滤器,所有处理DenyAnonymousAccessPolicyViolation的逻辑都只能在授权过滤器之后执行,例如ValidateAntiForgeryToken

这意味着如果当前用户的身份验证票超时,任何带有ValidateAntiForgeryToken 修饰的操作都会抛出异常,因为令牌不是为匿名用户创建的。

那么有没有办法解决这个问题?我目前正在研究两种解决方案:

  1. 创建我自己的授权过滤器来执行HandleSecurityAttribute 安全所做的完全相同的事情。
  2. 使用全局 Authorize 文件管理器处理身份验证并将角色/其他访问策略留给 FluentSecurity。

更新:

我在 github 上查看了一个演示,它的用户名和密码是 dev1 和 devdev。我将超时表单身份验证设置为 1 分钟。因此,如果您登录并等待一分钟,然后单击注销,您将获得未为匿名用户创建的令牌。在普通的 MVC 中,这不会发生,因为 [Authorize] 在 [ValidateAntiForgeryToken] 之前运行,这会将用户重定向回登录屏幕。

【问题讨论】:

    标签: fluent-security


    【解决方案1】:

    我对此没有任何问题。确保将 HandleSecurityAttribute 放在过滤器列表的首位!

    GlobalFilters.Filters.Add(new HandleSecurityAttribute(), 0);
    

    【讨论】:

    • 嗨 Kristoffer,问题是 ValidateAntiForgeryToken 是授权操作过滤器,它总是在正常 ActionFilter 之前运行。 0 的顺序仅保证 HnadleSecurityAttribute 在任何其他 ActionFilter 未授权操作过滤器之前执行。
    • 嗨 Kristoffer,我在 github 签入了一个演示,其用户名和密码是 dev1devdev。我将超时表单身份验证设置为 1 分钟。因此,如果您登录并等待一分钟,然后单击注销,您将获得未为匿名用户创建的令牌。在普通 MVC 中,这不会发生,因为 [Authorize][ValidateAntiForgeryToken] 之前运行,这会将用户重定向回登录屏幕。
    • 感谢您在 github 上发布演示。接下来我会看看这个问题,一旦我有关于这个问题的任何消息,我会回复你。
    • 我尝试从 AuthorizeAttribute 继承以及简单地实现 IAuthorizationFilter。在这两种情况下,它都没有任何区别。你有没有自己尝试过,如果有,你能成功吗?
    • 再看一遍,即使我们实现了 IAuthorizationFilter,您似乎也需要指定一个订单。您必须将其设置为 -1 才能在 ValidateAntiForgeryTokenAttribute 之前运行。所以这是有效的:filters.Add(new HandleSecurityAttribute(), -1);我将在 FluentSecurity 中进行此更改,并确保它是即将发布的 beta 版本的一部分。感谢您提请我注意!
    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 2013-07-18
    • 2013-11-27
    • 2012-07-14
    • 2020-07-10
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多