ASP.NET身份检查用户角色不起作用

时间:2013-11-21 21:56:37

标签: c# asp.net asp.net-mvc asp.net-identity

我有一个ASP.NET MVC 5应用程序。我正在使用标准的ASP.NET身份提供程序进行用户和角色管理。重要的是我从自己的存储库项目中使用IdentityUser,但这似乎没问题。我可以注册,登录,编辑用户和管理他们的角色。

我使用以下行添加用户角色:

UserManager.AddToRole(userdetail.Id, r);
db.Entry(userdetail).State = EntityState.Modified;
db.SaveChanges();

这似乎在数据库级别工作。

但是,我不能使用基于角色的身份验证,实际上是简单的

HttpContext.User.IsInRole("Administrator")

也不起作用。

[Authorize(Roles="Administrator")]

也不起作用。

我只能用这种方法检查用户是否是管理员:

UserManager.IsInRole(userID, "Administrator").

为什么?

在我发现的每个教程中,一切正常。可能是不同的项目存储库?或者ASP.NET身份这么多?

请建议,

3 个答案:

答案 0 :(得分:23)

在这种情况下,您需要注销并再次登录用户。

因为角色数据也存储在cookie中, 因此,您必须再次发出cookie才能使用它。

答案 1 :(得分:16)

似乎存在问题。 [设计问题]

  • 角色名称在AuthorizeAttribute和User.IsInRole
  • 中区分大小写
  • 角色名称在UserManager.IsInRole
  • 中不区分大小写

此外,请检查是否使用了正确的角色名称进行验证。

[以上是基于以下代码进行的测试。角色名称=“管理员”,用户被添加到角色“管理员”。]

[Authorize(Roles="Admin")] /*True as "Admin" has A capital as entered in Role name*/
public ActionResult Secured()
{
    if (User.IsInRole("admin")) /*This is False*/
    {
         Console.WriteLine("In");
    }
    if(UserManager.IsInRole(User.Identity.GetUserId(), "admin")) /*This is True!!*/
    {
         Console.WriteLine("In");
    }
    return View();
}

如果我们将属性更改为[Authorize(Roles="admin")],则会重定向到“登录”页面。

答案 2 :(得分:1)

你的web.config中有这个条目吗?

    <roleManager enabled="true">
        <providers>
            <clear />
            <add connectionStringName="ApplicationServices" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" applicationName="/" />
        </providers>
    </roleManager>

另外,如果我没记错的话,在不同版本的.NET中,角色提供程序程序集有一个不同的命名空间。