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

在Swagger生成的index.html中添加HSTS Header的问题

解决Swagger UI页面缺失HSTS响应头的问题

先排查中间件注册顺序(最可能的根源)

你的问题大概率是中间件注册顺序搞反了。.NET Core的中间件按注册顺序执行,如果UseHsts()和UseHttpsRedirection()在Swagger中间件之后注册,Swagger的请求会先被Swagger中间件处理并返回响应,根本走不到HSTS中间件,自然不会带上HSTS头。

调整Program.cs里的中间件顺序,把安全相关中间件放在Swagger之前:

// 先注册HSTS和HTTPS重定向
app.UseHsts();
app.UseHttpsRedirection();

// 再注册Swagger相关中间件
app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API版本名");
});

这样所有请求(包括Swagger的index.html)都会经过HSTS中间件,自动带上你在SetupSecurity里配置的HSTS头,既不会和接口的头重复,也不用修改现有配置。

如果调整顺序无效,用自定义中间件针对性添加头

如果因为某些原因不能调整中间件顺序,可以加一个自定义中间件,专门给Swagger的index.html页面添加HSTS头:

// 在Swagger中间件之前注册这个自定义中间件
app.Use(async (context, next) =>
{
    // 匹配Swagger UI的入口页面路径
    if (context.Request.Path.StartsWithSegments("/swagger") && 
        context.Request.Path.ToString().EndsWith("index.html"))
    {
        // 这里的HSTS值和你SetupSecurity里的配置保持一致
        context.Response.Headers.Append("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
    }
    await next();
});

// 然后注册Swagger中间件
app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API版本名");
});

这个中间件会拦截所有指向Swagger index.html的请求,手动添加HSTS头,完全不影响其他接口的现有配置,也不用在IIS里额外配置。

为什么之前的方法不行?

  • 直接在IIS加头会重复:因为接口已经通过代码配置了HSTS,IIS再加就会返回两个相同的头,不符合规范。
  • 不能删代码配置:上述方案完全保留你现有SetupSecurity里的配置,不用修改,不会增加客户部署的支持成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:00:16