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

Posted

技术标签:

【中文标题】ASP.NET 身份检查用户角色不起作用【英文标题】:ASP.NET Identity check user roles is not working 【发布时间】:2013-12-06 14:54:22 【问题描述】:

我有一个 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 Identity 被破坏了这么多?

请指教,

【问题讨论】:

我也有同样的问题。有什么解决办法吗? 答案已经发布。接受。 jd4u 的那个。 【参考方案1】:

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

因为角色数据也存储在 cookie 中, 所以你必须再次发出 cookie 才能工作。

【讨论】:

您也可以通过更新安全标记来实现相同的目的,而无需再次登录和注销用户。见***.com/a/19505060/110871【参考方案2】:

似乎有问题。 [设计问题]

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

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

[以上基于使用以下代码执行的测试。角色名称="Admin",用户被添加到角色“Admin”中。]

[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")],它会重定向到登录页面。

【讨论】:

你碰巧知道如何绕过这个因为我有完全相同的问题。我使用自定义用户和角色存储,但我猜应该注意,但使用管理器而不是通过用户和注释可以正常工作。 这救了我的命我不知道为什么这个答案没有被接受。没有其他提及这一点。去谷歌上查找“Identity userinrole”,你会看到不准确的“User.IsInRole” 这里区分大小写只是犯罪,它一定是一个错误。我在自己的代码中发现了这一点,并且在浪费了大量时间之后才找到了这个答案。提高你的答案! 我不知道为什么这个答案被接受了。我在控制器上使用 Authorize 属性,大小写与我的角色完全相同,拼写与我的角色完全相同,我肯定被分配到角色(我已经通过 RoleManager 调用检查并查看了数据库本身)它仍然不让我进入。这是在一个 .Net Core API 项目中。 @ataraxia 在这种情况下,原始问题特别指出 Authorize 属性和 User.IsInRole 不起作用,但 UserManager.IsInRole 起作用。这些返回不同的已知原因是区分大小写,即这个答案。在您的情况下,这可能是一个不同的问题。尝试复制原件,即检查 UserManager.IsInRole 是否有效。如果 UserManager(不区分大小写)也不起作用,那么您将遇到与原始海报不同的问题(例如 cookie 中的缓存数据)。【参考方案3】:

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

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

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

【讨论】:

你说的是最新的带有 ASP.NET Identity 的 ASP.NET MVC 5 吗? roleManager 用于角色提供者 (msdn.microsoft.com/en-us/library/…),它基本上已被弃用,并且不是所要求的 ASP.NET 身份【参考方案4】:

我在 Asp.Net 核心中使用了IsInRoleAsync,就我而言,问题是我在创建角色时忽略了角色的规范化名称。因此,在更新角色的规范化名称后,一切正常。

【讨论】:

以上是关于ASP.NET 身份检查用户角色不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP .Net Core 2.2 中添加 JWT 令牌后授权不起作用

ASP.NET Core Windows 身份验证和应用程序角色

Discord.js 检查用户是不是具有第一个角色或第二个角色不起作用

Discord.py:检查用户是不是具有列表中的角色 ID 不起作用

检查用户是不是在 ASP.NET Core 中使用基于令牌的身份验证登录

在 ASP.NET Core Identity 中使用 Authorize 属性检查多个策略之一