默认情况下,标头长度限制为 65536,这是在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters 注册表中设置的。我在本地机器和 Azure Web App 上都对其进行了测试。以下是我测试的代码。
在服务器端我使用
public class HomeController : Controller
{
public ActionResult Index()
{
return Content(Request.Headers["Authorization"]);
}
}
在客户端,我使用
static async void SendRequest()
{
HttpClient client = new HttpClient();
string token = "";
for (int i = 0; i < 2050; i++)
{
token = token + "0";
}
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage message = await client.GetAsync("http://xxx.azurewebsites.net/");
string content = await message.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
我可以取回授权参数。
通过反复试验,我发现标头值限制必须在 2048 左右
另一种修改限制的方法是 headerLimits 配置部分。我们可以使用此配置部分为特定标头添加长度限制。
如果我将以下配置添加到 web.config。我的客户的请求被阻止了,我收到以下错误。
<system.webServer>
<security>
<requestFiltering>
<requestLimits>
<headerLimits >
<add header="Authorization" sizeLimit="2048" />
</headerLimits>
</requestLimits>
</requestFiltering>
</security>
</system.webServer>
如果我增加sizeLimit来满足请求Authorization header的长度,比如2058,请求就会执行OK。
所以请检查您是否修改了 web.config 文件中的 headerLimits 配置部分。如果是,如果此标头的长度大于限制值,它将阻止您的请求。为了解决这个问题,我们可以增加 sizeLimit 的值来修改 Authorization 头的限制。