ASP.NET Core 5 MVC部署至IIS后执行表单操作返回Bad Request错误
可行解决方案如下:
- 适配防伪令牌Cookie配置
.NET默认防伪令牌Cookie会绑定请求域名、路径、HTTPS状态,IIS部署后的域名、访问协议、站点路径如果和本地开发环境不一致,就会触发校验失败,在Startup.cs的ConfigureServices方法添加如下配置:
services.AddAntiforgery(options => { // 替换为实际部署的站点域名,跨子域场景填写顶级域名如.example.com options.Cookie.Domain = "你的实际站点域名"; // 站点如果挂载在IIS子应用路径下(如http://domain.com/app),此处填写对应子路径 options.Cookie.Path = "/"; // HTTP站点设为SameSiteMode.Lax,HTTPS站点设为SameSiteMode.None options.Cookie.SameSite = SameSiteMode.Lax; // 若IIS做了HTTPS卸载(用户访问HTTPS,IIS转发到Kestrel为HTTP),保留该配置 options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; });
- 配置请求头转发规则
IIS作为反向代理默认不会携带原始请求的协议、域名等信息,会导致应用获取的请求上下文和用户实际请求不一致,首先在Startup.cs的Configure方法最开头添加转发头中间件,优先级必须高于其他中间件:
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost });
随后在IIS站点根目录的web.config中添加配置,让IIS转发对应请求头:
<configuration> <system.webServer> <httpProtocol> <customHeaders> <!-- 实际使用HTTP则填写http --> <add name="X-Forwarded-Proto" value="https" /> </customHeaders> </httpProtocol> </system.webServer> </configuration>
- 检查IIS站点Cookie与权限配置
- 打开IIS管理器对应站点的「功能视图」→「ASP.NET」→「会话状态」,确认Cookie的域名、路径配置和应用内防伪Cookie配置一致,无冲突
- 检查IIS「请求筛选」功能,确认默认防伪Cookie名称
.AspNetCore.Antiforgery.xxx未被拦截 - 确认浏览器请求头中确实携带了防伪Cookie,没有被安全软件、浏览器扩展拦截
- 配置持久化数据保护密钥
.NET防伪令牌依赖数据保护机制加密,IIS部署时如果没有配置持久化密钥,站点回收、应用重启都会导致密钥重置,之前下发的令牌全部失效,添加如下配置:
services.AddDataProtection() // 选择一个IIS应用池运行身份有读写权限的本地目录存储密钥 .PersistKeysToFileSystem(new DirectoryInfo(@"C:\secure\data-protection-keys")) .SetDefaultKeyLifetime(TimeSpan.FromDays(365));
给配置的密钥存储目录单独添加对应IIS应用池运行身份的读写权限,避免密钥写入失败。
内容的提问来源于stack exchange,提问作者SamyCode
相关产品推荐
相关产品推荐

