首页 文章

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

提问于
浏览
21

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

我使用以下行将用户添加到Role:

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

这似乎在DB级别工作 .

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

HttpContext.User.IsInRole("Administrator")

不起作用 .

[Authorize(Roles="Administrator")]

不起作用 .

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

UserManager.IsInRole(userID, "Administrator").

为什么?

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

请指教,

3 回答

  • 23

    There seems an issue. [设计问题]

    • 角色名称在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")] ,则会重定向到“登录”页面 .

  • 1

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

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

  • 16

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

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

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

相关问题