ExpireTimeSpan 控制 Cookie 的绝对过期时间(服务端拒绝验证),而非浏览器自动删除时间;其实际生效受 SlidingExpiration、CookiePolicy、SecurePolicy、HttpOnly 和 SameSite 等配置共同影响,需按环境动态设置并显式启用安全标志。

CookieAuthenticationOptions.ExpireTimeSpan 控制的是什么过期时间
ExpireTimeSpan 设置的是 Cookie 的“绝对过期时间”,即从签发时刻起,经过指定时长后,服务端将拒绝该 Cookie(即使客户端仍携带)。它不控制浏览器端的 Expires 或 Max-Age 属性——那是由 SlidingExpiration 和实际认证流程共同决定的。
常见误用是以为设了 ExpireTimeSpan = TimeSpan.FromHours(2) 就能让浏览器 2 小时后自动删 Cookie;实际上,若 SlidingExpiration = true(默认),只要用户在过期前有任意一次请求,服务端就会刷新 Cookie 并重置过期计时,浏览器收到新响应后才会更新 Set-Cookie 头里的 Max-Age。
- 若需强制“固定有效期”(不滑动),必须显式设置
SlidingExpiration = false - 若
SlidingExpiration = true,ExpireTimeSpan是滑动窗口的上限,不是每次签发的保底时长 - 浏览器是否删除 Cookie 还取决于是否设置了
IsEssential = true和用户的隐私设置(如 Chrome 的“第三方 Cookie 阻止”)
SecurePolicy 和 HttpOnly 必须手动开启才能生效
.NET 默认不会自动启用 Secure 或 HttpOnly 标志,哪怕你在生产环境跑 HTTPS。这两个选项必须在 CookieAuthenticationOptions 中明确配置,否则生成的 Cookie 会缺少对应属性,存在中间人窃取或 XSS 注入风险。
典型配置如下:
new CookieAuthenticationOptions
{
CookieName = "MyApp.Auth",
CookiePath = "/",
CookieHttpOnly = true,
CookieSecurePolicy = CookieSecurePolicy.Always,
ExpireTimeSpan = TimeSpan.FromHours(8),
SlidingExpiration = false
}
-
CookieSecurePolicy = CookieSecurePolicy.Always:强制只通过 HTTPS 发送 Cookie(开发时若用 HTTP,需改用CookieSecurePolicy.SameAsRequest,但上线前务必切回Always) -
CookieHttpOnly = true:阻止 JavaScript 访问document.cookie,防 XSS 窃取 -
CookieSameSite = SameSiteMode.Strict或Lax:建议显式设置,避免 CSRF(.NET 6+ 默认为Lax,但旧版本需手动配)
UseCookiePolicy 会影响所有 Cookie,不只是认证 Cookie
如果你调用了 app.UseCookiePolicy()(常见于 .NET Core 2.x–3.1 模板),它会统一拦截并修改所有出站 Cookie,包括 Identity.Application 这类认证 Cookie。它的行为优先级高于 CookieAuthenticationOptions 中的部分设置。
例如:CookiePolicyOptions.MinimumSameSitePolicy = SameSiteMode.None 会覆盖你为认证 Cookie 单独设置的 CookieSameSite = Strict,导致 SameSite 失效。
- 若不需要全局 Cookie 策略,直接删掉
UseCookiePolicy()调用 - 若保留,确保
CookiePolicyOptions与认证 Cookie 的安全要求一致,尤其注意MinimumSameSitePolicy和HttpOnly行为 - .NET 5+ 已移除
UseCookiePolicy,相关逻辑合并进CookieBuilder,无需额外中间件
开发环境 vs 生产环境的 Secure 标志陷阱
本地开发常用 HTTP(http://localhost:5000),此时若把 CookieSecurePolicy 设为 Always,浏览器会直接丢弃 Cookie(因为非 HTTPS 响应里带 Secure 属性是非法的),导致反复跳登录页。
最稳妥的做法是按环境动态配置:
CookieSecurePolicy securePolicy = env.IsDevelopment()
? CookieSecurePolicy.SameAsRequest
: CookieSecurePolicy.Always;
-
SameAsRequest表示:请求是 HTTP 就发 HTTP Cookie,HTTPS 就发 Secure Cookie——开发时有效,上线后自动适配 - 不要依赖
localhost特殊处理,某些代理或容器环境会让IsDevelopment()判断失效 - CI/CD 部署时,确保
ASPNETCORE_ENVIRONMENT正确设为Production,否则Always不会启用
真正容易被忽略的点是:Cookie 的 Secure 和 HttpOnly 是独立开关,缺一不可;而 SameSite 在跨域场景下若配错,连 POST 表单提交都会静默失败——这些都不是运行时报错,而是“看起来登录成功,但下一秒又跳回登录页”。










