You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 5 MVC部署至IIS后执行表单操作返回Bad Request错误

可行解决方案如下:

  1. 适配防伪令牌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;
});
  1. 配置请求头转发规则
    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>
  1. 检查IIS站点Cookie与权限配置
  • 打开IIS管理器对应站点的「功能视图」→「ASP.NET」→「会话状态」,确认Cookie的域名、路径配置和应用内防伪Cookie配置一致,无冲突
  • 检查IIS「请求筛选」功能,确认默认防伪Cookie名称.AspNetCore.Antiforgery.xxx未被拦截
  • 确认浏览器请求头中确实携带了防伪Cookie,没有被安全软件、浏览器扩展拦截
  1. 配置持久化数据保护密钥
    .NET防伪令牌依赖数据保护机制加密,IIS部署时如果没有配置持久化密钥,站点回收、应用重启都会导致密钥重置,之前下发的令牌全部失效,添加如下配置:
services.AddDataProtection()
    // 选择一个IIS应用池运行身份有读写权限的本地目录存储密钥
    .PersistKeysToFileSystem(new DirectoryInfo(@"C:\secure\data-protection-keys"))
    .SetDefaultKeyLifetime(TimeSpan.FromDays(365));

给配置的密钥存储目录单独添加对应IIS应用池运行身份的读写权限,避免密钥写入失败。

内容的提问来源于stack exchange,提问作者SamyCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:54:08