HTTP 400.请求标头的大小太长



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Request Too Long</h2>
<hr><p>HTTP Error 400. The size of the request headers is too long.</p>
</BODY></HTML>

我有一个 c# web api 和 angularjs webapp,它在部署服务器上的行为相当奇怪。

它会为一秒钟前工作的相同 Web API 调用随机引发 400 个错误请求错误。最初删除cookie并清除缓存可以修复这些错误,但是从过去几天开始,即使这样也不起作用。

我检查了我的标题大小,它完全在限制范围内。我有 4 个 cookie,每个几乎 4 MB,所以这应该不是问题。

此外,这仅在 QA 环境(使用 2 个盒子进行负载平衡(上发生,而在任何其他环境中都不会发生。

有什么建议吗?

编辑:这是浏览器的响应 错误请求 - 请求时间过长 HTTP 错误 400。请求标头的大小太长。

问题是由于我在其中存储了太多声明而导致 cookie 大小很大。通过减少不需要的声明(自定义声明(的数量来解决此问题,现在它工作正常。

将来需要弄清楚,如果应用程序确实有那么多声明,那么传递用户声明的替代方法。

我们遇到了类似的问题,并且无法减少声明数量,因为我们的 SSO 会通过用户所属的每个 AD 组,并且我们的许多用户都在大量组中。

我在StackOverflow中找到了对我有用的答案:

检查 MSDN:

原因

当用户是许多活动的成员时,可能会出现此问题 目录用户组。当用户是大量 活动目录对用户的 Kerberos 身份验证令牌进行分组 尺寸增加。用户发送到 IIS 的 HTTP 请求 服务器在 WWW-Authenticate 标头中包含 Kerberos 令牌,并且 标头大小随着组数的增加而增加。如果 HTTP 标头或数据包大小超过在 IIS、IIS 中配置的限制 可能会拒绝请求并将此错误作为响应发送。

分辨率

要变通解决此问题,请选择下列选项之一:

A( 减少用户所在的活动目录组的数量 的成员。

B( 修改 MaxFieldLength 和 MaxRequestBytes 注册表设置 在 IIS 服务器上,因此也不考虑用户的请求标头 长。要确定最大字段长度的适当设置,请执行以下操作: 最大请求字节注册表项,使用以下计算:

使用以下公式计算用户的 Kerberos 令牌的大小 在以下文章中进行了描述:

用户时 Kerberos 身份验证问题的新解决方案 属于许多群体 http://support.microsoft.com/kb/327825

在 上配置最大字段长度和最大请求字节注册表项 值为 4/3 * T 的 IIS 服务器,其中 T 是用户的令牌 大小,以字节为单位。HTTP 使用 base64 编码对 Kerberos 令牌进行编码 因此将令牌中每 3 个字节替换为 4 个 base64 编码的字节。对注册表所做的更改不会进行 效果,直到重新启动 HTTP 服务。此外,您可能有 以重新启动任何相关的 IIS 服务。

如果最大字段长度设置为其最大值 64 KB,则最大令牌大小注册表值应设置为 3/4 * 64 = 48 KB。

最新更新