角色/用户在 ASP.Net.Core.Identity 中可以拥有多少个声明?

dja*_*109 5 asp.net-identity asp.net-core

一个角色或用户可以拥有多少个声明?我一直在使用 ASP.Net.Core 2.2 和 AspNet.Core.Identity 开发一个应用程序。在我的浏览器上进行测试之前一切正常。在VS2019中调试没有这个问题。

我部署了我的应用程序以进行进一步测试并遇到此错误(如下)。我在 IE、GC 和 FF 中也遇到同样的问题。

HTTP Error 400. The size of the request headers is too long.
Run Code Online (Sandbox Code Playgroud)

我正在使用RolesRoleClaims

经过一番挖掘后,我发现它与角色/声明有关,因为事实上角色/声明太多,它会破坏缓存。基本上Identity是试图将所有声明存储在 cookie 中,而 cookie 现在太大了。

微软给你这么多的复杂性却让你受到浏览器的阻碍,这看起来真的很奇怪。

所以我的问题是: - 如果由于浏览器限制而无法利用角色/声明,那么它们的意义何在?- 是否有任何关于虚构限制(每个角色的最大索赔数)的记录?

dja*_*109 1

只是想让你知道,无论我如何尝试,我都无法让 ITicketStore 工作。我什至花了几天时间阅读了 ITicketStore 上我能找到的所有文档,但它们的文档根本不是很好。这似乎是一个很常见的问题(cookie 的事情和 ITicketStore 文档)。

无论如何,我更改了我的应用程序,以便 Asp.Net.Identity 只选择用户角色。这解决了 cookie 大小问题。

我已经实现了自己的功能来检查角色声明。我觉得哪个效果更好,因为任何更改都是实时发生的,因此无需登录/注销即可获取新的索赔或撤销现有的索赔。

我有一个服务函数,它需要一个IdentityUser<AppUser>和一个声明名称(字符串)。

_adminService.UserHasClaim(user, ClaimName) // returns true or false if you have that claim or not
Run Code Online (Sandbox Code Playgroud)

我有自己的表,与包含值的 AspNetRoleClaims 表相同。该表的 Asp.Net.Identity 版本现在为空,因此 cookie 不包含任何声明。

    public bool UserHasClaim(AppUser user, string claimValue)
    {
        var claim = (from c in _context.AppUserRoleClaims
                     join t in _context.AppUserClaimTypes on c.ClaimID equals t.ID
                     join r in _context.UserRoles on c.RoleId equals r.RoleId
                     where r.UserId == user.Id && t.ClaimValue == claimValue select c).FirstOrDefault();

        return (claim != null);
    }
Run Code Online (Sandbox Code Playgroud)

它可能不完美或不理想,但它有效,而且我再也没有时间尝试使用身份来解决这个问题了。我并不认为它是理想的,我可能会稍后再回来讨论它。

很高兴就更好的可行解决方案发表评论,但现在这就是我解决问题的方式。

所以,继续...

  • 是的:)我有一个名为“IsInRole(...)”的函数来为我处理该检查。因为我想要一个非常详细的安全模型,并且有很多角色,所以尝试将它们全部存储在 cookie 中会导致事情崩溃 (2认同)