ASP.NET Core中Strict-Transport-Security的max-age无法更新至31536000问题
问题分析与解决方案
你的HSTS头max-age被覆盖为30天,大概率是以下两个原因之一:
1. Azure App Service默认HSTS配置冲突
Azure App Service自带HSTS功能,若在门户中开启了该设置,会自动向响应添加Strict-Transport-Security头,默认max-age就是30天(2592000秒),这会直接覆盖你代码中设置的头。
解决步骤:
- 登录Azure门户,进入你的App Service资源
- 找到「TLS/SSL设置」→「HTTP严格传输安全(HSTS)」
- 若要保留Azure的HSTS管理:修改
max-age为31536000秒,勾选「includeSubDomains」和「preload」选项后保存 - 若要完全由代码控制:关闭Azure的HSTS开关,保存后重新部署应用
2. ASP.NET Core官方HSTS中间件覆盖
如果你的项目中使用了ASP.NET Core内置的UseHsts()中间件,它默认会设置max-age为30天,且如果你的自定义中间件执行顺序在它之前,就会被官方中间件的设置覆盖。
解决步骤:
方案A:改用官方中间件配置(推荐)
移除你自定义的HSTS中间件,改用官方提供的配置方式,更规范且不易冲突:
// 在Program.cs中配置HSTS服务 builder.Services.AddHsts(options => { options.MaxAge = TimeSpan.FromDays(365); // 等同于31536000秒 options.IncludeSubDomains = true; options.Preload = true; }); // 仅在生产环境启用HSTS中间件 if (!builder.Environment.IsDevelopment()) { app.UseHsts(); }
确保app.UseHsts()的位置在app.UseRouting()之后、app.UseEndpoints()之前。
方案B:调整自定义中间件
如果坚持使用自定义中间件,需做两处修改:
- 用
Replace替代Append,避免重复头并强制覆盖已有设置:context.Response.Headers.Replace("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload"); - 调整中间件顺序,将你的自定义HSTS中间件放在所有可能添加HSTS头的中间件(如
UseHsts())之后执行,确保你的设置最后生效。
验证方法
修改完成后,重新部署应用,再次清除浏览器缓存(或使用无痕模式),查看响应头确认max-age值是否正确。
内容的提问来源于stack exchange,提问作者Yash Desai
相关产品推荐
相关产品推荐

