.NET6 Web App+IIS6环境下STS生成Cookie请求头过长解决方案
问题描述
使用外部身份提供商Azure AD,无法控制组/角色数量,STS(Ws Fed)生成的Cookie请求头超出限制,报错:
Bad Request - Header Field Too Long
HTTP Error 400. A request header field is too long.
系统环境:.NET 6 Web App + IIS 6
已尝试的操作
- 在web.config中添加配置:
<system.web><httpRuntime maxRequestLength="16777210" maxRequestHeadersTotalSize="131068"/></system.web> - 在web.config中添加安全配置:
<security> <requestFiltering> <requestLimits maxAllowedContentLength="16777210"> <headerLimits> <add header="Cookie" sizeLimit="131068" /> </headerLimits> </requestLimits> </requestFiltering> </security> - 在注册表路径
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters中定义MaxFieldLength和MaxRequestBytes - 添加代码配置:
builder.Services.Configure<IISServerOptions>(options => { options.MaxRequestBodySize = int.MaxValue; options.MaxRequestBodyBufferSize = int.MaxValue; }); - 已在Kestrel上通过
kestrelOptions.Limits.MaxRequestHeadersTotalSize = int.MaxValue解决,但需适配IIS 6环境。
针对IIS 6的解决方案
1. 调整HTTP.sys注册表参数(核心步骤)
IIS 6依赖HTTP.sys处理请求,必须确保以下注册表参数设置足够大:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters - 添加或修改DWORD类型的键值:
MaxFieldLength:设置为大于当前Cookie头长度的数值,建议设为65536(64KB),最大值不超过65535MaxRequestBytes:值必须大于MaxFieldLength,建议设为131072(128KB)
- 修改完成后,执行命令重启HTTP服务:
net stop http && net start http,或直接重启服务器
2. 配置IIS 6站点的请求限制
IIS 6的请求筛选需通过IIS管理器或metabase.xml配置:
- 通过IIS管理器:右键目标站点 → 属性 → 主目录 → 配置 → 选项,将“启用内容长度限制”设置为足够大的值(如16MB即
16777216) - 通过metabase.xml:找到对应站点的配置条目,添加
HeaderLimits属性限制Cookie头大小,示例:
修改后需重启IIS服务生效<IIsWebServer ... HeaderLimits="Cookie:65536" />
3. 完善ASP.NET Core集成配置
在web.config中添加ASP.NET Core模块的请求头大小限制:
<system.webServer> <aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> <limits maxRequestHeadersTotalSize="65536" /> </aspNetCore> </system.webServer>
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

