首页 > 解决方案 > 角色/用户在 ASP.Net.Core.Identity 中可以拥有多少个声明?

问题描述

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

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

HTTP Error 400. The size of the request headers is too long.

我正在使用RolesRoleClaims

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

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

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

标签: asp.net-coreasp.net-identity

解决方案


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

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

总而言之,您在这里应该做的最好的事情就是减少索赔的数量。并非所有事情都需要或应该是索赔。将附加数据存储在用户配置文件中并根据需要进行查询。您绝对应该拥有的唯一声明是 id、用户名/电子邮件和角色等关键内容。如果您需要,其他任何东西都可以在以后或当您需要时从备用商店中获取。

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


推荐阅读