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)
我正在使用Roles和RoleClaims
经过一番挖掘后,我发现它与角色/声明有关,因为事实上角色/声明太多,它会破坏缓存。基本上Identity是试图将所有声明存储在 cookie 中,而 cookie 现在太大了。
微软给你这么多的复杂性却让你受到浏览器的阻碍,这看起来真的很奇怪。
所以我的问题是: - 如果由于浏览器限制而无法利用角色/声明,那么它们的意义何在?- 是否有任何关于虚构限制(每个角色的最大索赔数)的记录?
只是想让你知道,无论我如何尝试,我都无法让 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)
它可能不完美或不理想,但它有效,而且我再也没有时间尝试使用身份来解决这个问题了。我并不认为它是理想的,我可能会稍后再回来讨论它。
很高兴就更好的可行解决方案发表评论,但现在这就是我解决问题的方式。
所以,继续...
| 归档时间: |
|
| 查看次数: |
3496 次 |
| 最近记录: |