为什么User.IsInRole会返回true,但AuthorizeAttribute不是?

时间:2011-01-25 20:05:54

标签: asp.net asp.net-mvc

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

这是真的:

User.IsInRole("Foo")

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

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

对于遇到类似问题的未来人员 - 可能取决于您如何在当前用户上设置角色。

我遇到了一个类似的问题,即在基本控制器的覆盖OnActionExecuting中,角色被从cookie中拉出来。事实证明这是在 [Authorize]属性之后执行,因此当属性检查它们时,实际上没有设置角色。在User.IsInRole之后,对OnActionExecuting的调用正在User.IsInRole之后执行,因此它看到角色正常。

所以[Authorize]返回了我的预期,但protected void Application_AuthenticateRequest(Object sender, EventArgs e) { // do stuff in here } 属性没有。

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

{{1}}

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

答案 2 :(得分:-1)

他们都应该回归真实。您是否尝试使用SQL事件探查器检查针对数据库运行的查询?