【问题标题】:Why would User.IsInRole return true, but AuthorizeAttribute not?为什么 User.IsInRole 会返回 true,但 AuthorizeAttribute 不会?
【发布时间】:2014-03-12 07:07:39
【问题描述】:

我正在保护一个 ASP.NET MVC 2 应用程序,并且我有一个角色为“Foo”的用户。

这是真的:

User.IsInRole("Foo")

但是,当我尝试锁定如下控制器操作时,用户被拒绝:

[Authorize(Roles = "Foo")]
public ActionResult PrivatePage()
{
    return View();
}

如果 IsInRole 报告为 true,为什么 Authorize 属性不允许用户进入?

【问题讨论】:

  • 您是否有另一个 [Authorize] 属性,可能在控制器类型本身上?

标签: asp.net asp.net-mvc


【解决方案1】:

如果您为表单身份验证 cookie 存储持久性 cookie,可能会导致这种情况。在这种情况下,IsInRole 可能会在不验证最新登录的情况下检查 cookie。

【讨论】:

    【解决方案2】:

    对于未来有类似问题的人 - 这可能取决于您如何实际设置当前用户的角色。

    我遇到了类似的问题,即角色被从 cookie 中拉出,并覆盖了基本控制器中的 OnActionExecuting。原来这是在[Authorize] 属性之后执行的,所以在属性检查角色时实际上并没有设置角色。在视图中对User.IsInRole 的调用是在OnActionExecuting 之后执行的,因此它可以很好地看到角色。

    所以User.IsInRole 返回了我的预期,但[Authorize] 属性没有。

    我能够通过将获取角色的代码移到更合理的位置来解决这个问题,该位置在 Authorize 属性之前执行 - 例如,在 Global.asax.cs 中:

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        // do stuff in here
    }
    

    或者甚至更好,在您自己的自定义属性中 - 请参阅 https://stackoverflow.com/a/5314736/206297

    【讨论】:

      【解决方案3】:

      它们都应该返回 true。您是否尝试过使用 SQL Profiler 检查针对数据库运行的查询?

      【讨论】:

      • 这里不涉及数据库。这完全在内存中。
      • 您为会员和角色提供者使用什么?默认设置仍然是使用 sql express(我相信)。如果你没有改变任何东西,你应该可以查看 sql express 数据库。如果您正在使用与 mvc 2 的项目模板之一一起使用的测试提供程序,您应该能够在其中放置一些断点或 System.Diagnostic.Debug.WriteLine() 调用。
      • IPrincipal != SQL 提供程序。您和 Simon 似乎有这种印象,但 IPrincipal(在本例中为用户)确实没有与成员资格或角色提供者耦合。您可以实例化一个主体对象并在内存中以编程方式对其进行操作,这就是我在这里所做的。
      • 为了进一步澄清,我可以去“httpContext.User = Thread.CurrentPrincipal = new GenericPrincipal();”并让问题中的代码对其进行操作,没有角色或成员资格提供者发挥作用。
      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      相关资源
      最近更新 更多