【发布时间】:2018-03-08 21:43:49
【问题描述】:
我有一个 ASP.NET Core 2.0 网站,它使用 vanilla 实现使用身份和 cookie(不使用 OpenID Connect)进行身份验证/授权。我有一组 20 个角色,每个角色都可能有数百个用于访问网站页面/功能的声明(使用 Authorize 来装饰控制器方法)。我希望能够控制对这些页面/功能的访问,而无需在每次需要更改时重新编译站点;相反,我允许管理员直接通过站点添加/删除角色声明。出于某种原因,根据投射到用户身份上的声明数量,我达到了上限。
我收到一个错误
HTTP Error 400. The size of the request headers is too long
知道为什么我会收到这条消息吗?存储/访问这些声明以通过授权使用的最佳做法是什么?
【问题讨论】:
-
声明的最佳实践是不要让它们过于细化。它们应该映射到每个应用程序解释为自己使用的角色。对于请求标头大小,您无能为力,因为它通常在 HTTP 处理硬件中定义。
-
您在索赔中存储什么样的数据?如果它只是角色,那么与请求标头限制对接会花费很多时间。如果可以的话,考虑将其中的一些改组到您的实际用户实体。并非每件事都应该或需要成为索赔。
-
我只是将它用于角色权限,当投射到用户身份上时,大约有 150 个声明,我认为这完全在限制范围内。这将分块 cookie 的数量扩展到 4 个块;再次,我认为会在限制范围内。是否建议使用块大小?
-
不,您要达到的限制是标题的总大小。 150个索赔太多了。大型身份的后备计划是 cookieAuthOptions.SessionStore。 github.com/aspnet/Security/blob/dev/samples/CookieSessionSample/…
-
刚刚偶然发现了这个线程。 @Tratcher 提到的 Github 上的示例现在在这里:github.com/aspnet/Security/tree/master/samples/…
标签: asp.net-core asp.net-core-2.0 claims-based-identity