在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
相关产品推荐
相关产品推荐

