【问题标题】:Claims Stored in Cookies Exceed Max Request Header Length存储在 Cookie 中的声明超过最大请求标头长度
【发布时间】: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


【解决方案1】:

在 Windows 服务器上遇到了同样的问题。我不得不求助于注册表设置。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters

MaxFieldLength (DWORD) 十进制值 65534

MaxRequestBytes (DWORD) 十进制值 16777216

https://support.microsoft.com/en-ca/help/820129/http-sys-registry-settings-for-windows

【讨论】:

  • 我执行了上述操作,但仍然出现错误。我有大约 70 多个索赔。
【解决方案2】:

通过配置 CookieAuthenticationOptions 以使用会话存储解决了这个问题。 以下链接详细解释了“Auth Cookies in ASP.NET Core”及其配置选项

Click Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2017-04-08
    相关资源
    最近更新 更多