ASP.NET 6 WebAPI中Cookie认证会话重启后仍有效问题咨询
ASP.NET 6 Cookie认证:会话存储与重启后登录问题解答
1. 身份票据的存储位置
你调用await HttpContext.SignInAsync(...)生成的是加密的身份认证票据,这个票据直接存储在客户端的.AspNetCore.Cookies Cookie中,服务器端默认不会保存任何会话数据(因为你未启用AspNetCore.Session)。
服务器重启后仍能识别登录状态的核心原因:客户端请求时会携带该加密Cookie,服务器使用启动时配置的加密密钥(框架自动生成或手动配置)解密票据,验证签名与有效期,只要票据未过期且签名合法,就会判定用户处于登录状态。
2. 如何禁用“重启后仍保持登录”的特性
要实现服务器重启后旧Cookie失效,有两种常用方案:
方案1:缩短票据有效期(简单直接)
在配置Cookie认证时,设置较短的ExpireTimeSpan,同时关闭滑动过期,确保票据到期后自动失效,重启后即使Cookie存在也会被拒绝:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // 设置票据有效期,例如1小时 options.ExpireTimeSpan = TimeSpan.FromHours(1); // 关闭滑动过期,避免自动延长有效期 options.SlidingExpiration = false; // 同步Cookie过期时间与票据有效期 options.Cookie.Expiration = options.ExpireTimeSpan; });
方案2:将票据存储在服务器端(彻底解决重启失效)
如果需要严格控制服务器重启后旧会话失效,可将身份票据存储在服务器端分布式缓存中(内存缓存、Redis等),服务器重启后缓存清空,旧Cookie对应的票据无法被匹配,自动失效:
- 添加分布式缓存服务(以内存缓存为例,生产环境推荐Redis):
builder.Services.AddDistributedMemoryCache();
- 配置Cookie认证时指定
SessionStore:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // 用分布式缓存存储票据 options.SessionStore = new DistributedTicketStore( builder.Services.BuildServiceProvider().GetRequiredService<IDistributedCache>()); });
注:DistributedTicketStore是ASP.NET Core内置实现,默认包含在WebAPI模板的Microsoft.AspNetCore.Authentication.Cookies包中。
内容的提问来源于stack exchange,提问作者yaromir
相关产品推荐
相关产品推荐

