一个角色或用户可以有多少个声明?我一直在开发一个使用ASP.Net.Core 2.2和AspNet.Core.Identity的应用程序。在我的浏览器上测试之前,一切都很好。在VS2019中的调试下,没有这样的问题。
我部署了我的应用程序进行进一步的测试,并遇到了这个错误(如下所示)。我在IE,GC和FF中也有同样的问题。
HTTP Error 400. The size of the request headers is too long.我使用的是Roles和RoleClaims
在深入研究后,我发现它与角色/声明有关,因为它们太多了,以至于它会炸毁缓存。基本上,Identity试图将所有声明存储在cookie中,而cookie现在太大了。
这似乎真的很奇怪,微软会给你所有的复杂性,而你却被浏览器所阻挠。
所以我的问题是:-如果你可以因为浏览器限制而利用角色/声明,那么角色/声明的意义是什么?-有任何关于假想限制的记录(max,no。每个角色的声明数)?
发布于 2019-11-22 02:37:48
这个限制不是想象出来的,也不是基于浏览器的。请求限制由服务器设置,是一种安全措施。因此,尝试增加限制真的不是一个好主意。
此外,这里没有关于最大索赔数量之类的实际指导,因为它是基于变量的:单个索赔的类型和大小,以及请求的其他部分,如在任何给定时间可能添加或不添加的附加头。然而,限制通常是8-32K,即使是在低端,这仍然是相当多的索赔,你应该能够在达到限制之前添加。一般来说,您还应该考虑传输大小。声明是身份验证票证的一部分,这意味着客户端必须在每次请求时传输它们。每个请求8K可能看起来不是很多,但在用户会话的生命周期中可能会显著增加,特别是当用户使用慢速或有上限的数据连接时。
长此以往,你应该做的最好的事情就是减少索赔数量。并不是所有的东西都需要或者应该是一个声明。将其他数据存储在用户配置文件中,并根据需要进行查询。你唯一绝对应该拥有的声明是关键的东西,比如id、用户名/电子邮件和角色。其他任何东西都可以在以后需要时从备用存储中获取。
首先,还可以选择使用备用存储来实际保存身份验证票证数据。您可以简单地发送一个标识符,然后根据该标识符提取实际数据,类似于会话的工作方式,而不是将所有内容都作为cookie发送,然后必须随每个请求一起返回。这是通过创建ITicketStore的实现并为CookieAuthenticationOptions.SessionStore设置该实现来完成的。有一个old sample for using cache as the store。您可能需要为新版本的ASP.NET核心修改代码。
https://stackoverflow.com/questions/58980811
复制相似问题