首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ASP.Net.Core.Identity中,一个角色/用户可以有多少个声明?

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

Stack Overflow用户
提问于 2019-11-22 01:42:40
回答 2查看 1.3K关注 0票数 3

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

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

代码语言:javascript
运行
复制
HTTP Error 400. The size of the request headers is too long.

我使用的是RolesRoleClaims

在深入研究后,我发现它与角色/声明有关,因为它们太多了,以至于它会炸毁缓存。基本上,Identity试图将所有声明存储在cookie中,而cookie现在太大了。

这似乎真的很奇怪,微软会给你所有的复杂性,而你却被浏览器所阻挠。

所以我的问题是:-如果你可以因为浏览器限制而利用角色/声明,那么角色/声明的意义是什么?-有任何关于假想限制的记录(max,no。每个角色的声明数)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-29 05:05:54

只是想让你知道,无论我怎么努力,我都不能让ITicketStore工作。我甚至花了几天时间阅读了我能在ITicketStore上找到的所有文档,它根本没有很好的文档记录。这似乎是一个相当常见的问题( cookie和ITicketStore文档)。

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

我已经实现了自己的函数来检查角色声明。我觉得这样做效果更好,因为任何更改都是实时发生的,所以不需要登录/注销来获得新的申请或撤销现有的申请。

我有一个服务函数,它接受一个IdentityUser<AppUser>和一个索赔名称(字符串)。

代码语言:javascript
运行
复制
_adminService.UserHasClaim(user, ClaimName) // returns true or false if you have that claim or not

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

代码语言:javascript
运行
复制
    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);
    }

它可能不是完美的或理想的,但它是有效的,我不能再花更多的时间尝试使用身份来解决这个问题。我并不认为它是理想的,我可能会在晚些时候回来讨论它。

很高兴对更好的可行解决方案发表意见,但目前这就是我解决问题的方式。

接下来..。

票数 0
EN

Stack Overflow用户

发布于 2019-11-22 02:37:48

这个限制不是想象出来的,也不是基于浏览器的。请求限制由服务器设置,是一种安全措施。因此,尝试增加限制真的不是一个好主意。

此外,这里没有关于最大索赔数量之类的实际指导,因为它是基于变量的:单个索赔的类型和大小,以及请求的其他部分,如在任何给定时间可能添加或不添加的附加头。然而,限制通常是8-32K,即使是在低端,这仍然是相当多的索赔,你应该能够在达到限制之前添加。一般来说,您还应该考虑传输大小。声明是身份验证票证的一部分,这意味着客户端必须在每次请求时传输它们。每个请求8K可能看起来不是很多,但在用户会话的生命周期中可能会显著增加,特别是当用户使用慢速或有上限的数据连接时。

长此以往,你应该做的最好的事情就是减少索赔数量。并不是所有的东西都需要或者应该是一个声明。将其他数据存储在用户配置文件中,并根据需要进行查询。你唯一绝对应该拥有的声明是关键的东西,比如id、用户名/电子邮件和角色。其他任何东西都可以在以后需要时从备用存储中获取。

首先,还可以选择使用备用存储来实际保存身份验证票证数据。您可以简单地发送一个标识符,然后根据该标识符提取实际数据,类似于会话的工作方式,而不是将所有内容都作为cookie发送,然后必须随每个请求一起返回。这是通过创建ITicketStore的实现并为CookieAuthenticationOptions.SessionStore设置该实现来完成的。有一个old sample for using cache as the store。您可能需要为新版本的ASP.NET核心修改代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58980811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档