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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:35:08