.NET 6中ASP.NET State Service失效,分布式会话登录问题求解
.NET 6 负载均衡下登录状态跨服务器共享问题排查与解决
核心原因分析
.NET 6 中,EF Core 认证的用户身份信息默认存储在Cookie而非传统会话(Session)中。你配置的分布式缓存仅处理了手动设置的Session变量,但未覆盖认证Cookie的一致性配置与分布式存储逻辑,这是登录状态无法跨服务器共享的核心问题。
分步解决步骤
1. 统一认证Cookie的核心配置
两台服务器必须使用完全相同的数据保护密钥与Cookie参数,否则各自加密的Cookie无法互相解析。在Program.cs中添加以下配置:
// 配置数据保护,将密钥持久化到共享MSSQL存储 builder.Services.AddDataProtection() .PersistKeysToSqlServer(new SqlConnection(builder.Configuration.GetConnectionString("DistCacheConn"))) .SetApplicationName("YourUniqueAppName"); // 两台服务器必须使用完全一致的应用名称 // 统一认证Cookie配置 builder.Services.ConfigureApplicationCookie(options => { options.Cookie.Name = ".AspNetCore.Identity.Application"; options.Cookie.Domain = "your-root-domain.com"; // 负载均衡集群的根域名 options.Cookie.Path = "/"; options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 生产环境建议启用HTTPS options.Cookie.SameSite = SameSiteMode.None; // 适配负载均衡跨节点场景 options.ExpireTimeSpan = TimeSpan.FromDays(7); options.SlidingExpiration = true; });
2. 完善分布式缓存配置
确保MSSQL分布式缓存配置正确,且会话状态使用该缓存:
// 配置MSSQL分布式缓存 builder.Services.AddDistributedSqlServerCache(options => { options.ConnectionString = builder.Configuration.GetConnectionString("DistCacheConn"); options.SchemaName = "dbo"; options.TableName = "DistributedCache"; }); // 启用会话状态,绑定分布式缓存 builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; options.Cookie.Domain = "your-root-domain.com"; // 与认证Cookie域名保持一致 });
注意:两台服务器的appsettings.json中数据库连接字符串必须完全一致,且数据库账号具备缓存表的读写权限。
3. IIS节点一致性检查
- 两台服务器的应用程序池配置统一:.NET CLR版本选择
无托管代码(.NET 6为独立部署模式),管道模式设为集成。 - 负载均衡器可临时启用
基于Cookie的会话亲和性作为过渡方案,待配置稳定后可关闭,实现真正的无状态集群。 - 确保两台服务器系统时间同步,Cookie过期时间依赖本地时间,时间差过大可能导致Cookie提前失效。
4. EF Core认证逻辑校验
- 确认两台服务器连接的是同一MySQL实例,用户身份数据完全一致。
- 排查认证代码中是否存在依赖服务器本地资源的逻辑(如本地文件存储的权限配置),确保所有认证数据均来自共享MySQL数据库。
验证方法
- 在服务器A完成登录,复制浏览器中的
.AspNetCore.Identity.ApplicationCookie值。 - 在服务器B的浏览器中手动添加该Cookie,访问需登录权限的页面,验证是否能正常访问。
- 查看MSSQL的
DistributedCache表,确认登录后有新的缓存条目生成。
内容的提问来源于stack exchange,提问作者Eric Rameil
相关产品推荐
相关产品推荐

