1

我有一种情况,特定用户的HTTP 授权请求标头大小超过64kb (大约 90kb)。size大的原因是header中包含了bearer token,发起http请求的用户有很多claim。

问题是对于这个特定的用户,Web 服务器总是返回一个错误,说明:

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

Web 应用程序使用Microsoft owin自托管在控制台应用程序中,因此不涉及 iis。

在调查这个问题时,我遇到了以下文件。它表示 MaxFieldLength 的最大值为 64kb,表示 http.sys 处理的最大标头长度,我的服务器设置为最大值,即 65,536。

出于好奇,我尝试将值进一步增加到 131,072,但正如预期的那样,它并没有解决问题。

那么还有其他方法可以增加标头最大长度吗?

4

2 回答 2

0

我遇到了这个问题并通过增加注册表中设置的限制来解决它。(打开命令并输入 regedit)。

您修改是对的MaxFieldLength,但是,您还必须MaxRequestBytes按照文档中的说明进行修改:

解决方法 2:设置 MaxFieldLength 和 MaxRequestBytes 注册表项:

默认情况下,没有 MaxFieldLength 注册表项。此条目指定每个 HTTP 请求标头的最大大小限制。MaxRequestBytes 注册表项指定请求行和标头的总大小的上限。通常,此注册表项与 MaxRequestBytes 注册表项一起配置。

如果 MaxRequestBytes 值低于 MaxFieldLength 值,则调整 MaxFieldLength 值。在大型 Active Directory 环境中,如果这两个条目的值未设置为足够高的值,用户可能会遇到登录失败。

您必须在以下位置添加/修改这些条目:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters 

对于 IIS 6.0 和更高版本,MaxFieldLength 和 MaxRequestBytes 注册表项位于以下子项中:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

于 2021-02-21T04:59:00.767 回答
0

在意识到 http.sys 服务器无法解决将大小限制增加到超过规定的最大值时,已实施以下解决方案来克服手头的问题。

免责声明:这更像是一种解决方法,而不是适当的解决方案。

通过以下更改创建现有控制器的新版本(v2,因为这些是重大更改):

  • 将每个 GET 请求转换为 POST 请求,并将任何适用的查询参数作为请求正文中的键值对传递。
  • 在每个请求正文中添加一个附加键"access_token",其值为bearer token用于处理授权。忽略未受保护的端点。
  • 更新文档并通过清晰的示例通知所有最终用户所做的更改。
  • "Deprecated"用标签装饰旧版本。
于 2021-03-12T14:14:54.227 回答