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

.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数据库。

验证方法

  1. 在服务器A完成登录,复制浏览器中的.AspNetCore.Identity.Application Cookie值。
  2. 在服务器B的浏览器中手动添加该Cookie,访问需登录权限的页面,验证是否能正常访问。
  3. 查看MSSQL的DistributedCache表,确认登录后有新的缓存条目生成。

内容的提问来源于stack exchange,提问作者Eric Rameil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:54:19