我遇到的情况是,特定用户的 HTTP 授权请求标头 大小超过 64kb(大约 90kb)。尺寸较大的原因是因为标头包含不记名令牌,并且发起http请求的用户有很多声明。
问题是对于这个特定用户,网络服务器总是返回一个错误,指出:
"HTTP Error 400. The size of the request headers is too long".
Web 应用程序使用 Microsoft owin 在控制台应用程序中自托管,因此不涉及 IIS。
在调查问题时,我遇到了 http.sys 参数 以及此表:(摘录)
注册表键 | 默认 | 有效值范围 | 注册表键功能 |
---|---|---|---|
|
16384 | 64 - 65534 (64k - 2)字节 |
为每个标头设置上限。请参阅 。此限制相当于 URL 的大约 32k 个字符。 |
|
16384 | 256 - 16777216 (16 MB) 字节 |
确定请求行和标头总大小的上限。 其默认设置为 16 KB。如果该值低于 ,则调整 值。 |
它表示
MaxFieldLength
的最大值是64kb,这表示http.sys
处理的最大标头长度,而我的服务器设置为最大值,即65,536。
出于好奇,我尝试将值进一步增加到 131,072,但正如预期的那样,它并没有解决问题。
那么还有其他方法可以增加标头最大长度吗?
我遇到了这个问题,并通过增加注册表中设置的限制来解决它。 (打开命令并输入 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
在意识到 http.sys 服务器无法将大小限制增加到超出规定的最大值后,已实施以下解决方案来克服当前的问题。
免责声明:这更多的是一种解决方法,而不是正确的解决方案。
创建现有控制器的新版本(v2,因为这些是重大更改),并进行以下更改:
"access_token"
,其值为 bearer token
,用于处理授权。忽略未受保护的端点。"Deprecated"
标签装饰旧版本。