我们可以在 Windows

问题描述

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

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

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

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

在调查问题时,我遇到了 following document。它表示 MaxFieldLength 的最大值为 64kb,表示 http.sys 处理的最大标头长度,我的服务器设置为最大值 i,e 65,536。

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

那么有没有其他方法可以增加header最大长度?

解决方法

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

您修改 MaxFieldLength 是正确的,但是,您还必须修改 MaxRequestBytes,正如 documentation 中所述:

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

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

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

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

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters 

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

,

在意识到 http.sys 服务器没有可能的解决方案将大小限制增加到超出规定的最大值后,已实施以下解决方案来解决手头的问题。

免责声明:与其说是正确的解决方案,不如说是一种变通方法。

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...