ASP.NET Core 3.1部署到服务器后用户无法保持登录状态如何解决
登录状态无法保持问题排查及修复方案
替换分布式缓存实现
你当前使用的AddDistributedMemoryCache是进程内缓存,仅适用于本地开发单实例场景。生产环境如果有多实例部署、应用池回收、应用重启的情况,内存缓存会被清空,导致会话数据丢失,用户直接登出。需要替换为持久化的分布式缓存,Redis实现示例如下:
// 先安装NuGet包:Microsoft.Extensions.Caching.StackExchangeRedis services.AddStackExchangeRedisCache(options => { options.Configuration = "你的Redis服务连接地址"; options.InstanceName = "SessionCache"; });
如果没有Redis服务,也可以使用SqlServer作为分布式缓存存储。
配置数据保护密钥持久化
AspNetCore.Identity的身份验证Cookie默认使用数据保护服务加密,默认密钥仅存储在当前进程内存中,应用重启、应用池回收、多实例部署时密钥会失效或不统一,导致已有Cookie无法解密,用户被强制登出。需要配置密钥持久化存储:
// 配置要放在ConfigureServices方法的开头位置 services.AddDataProtection() // 密钥存储目录要给应用池运行账号开放读写权限 .PersistKeysToFileSystem(new DirectoryInfo(@"C:\网站运行目录\密钥存储文件夹")) .SetApplicationName("你的应用统一名称"); // 多实例部署时所有实例的应用名称必须完全一致
显式配置Identity身份验证Cookie属性
你当前没有显式配置Identity的Cookie过期规则,默认的会话Cookie会在用户关闭浏览器后直接失效,同时默认过期时间不符合你的业务需求,需要在注册Identity服务时添加Cookie配置:
services.AddIdentity<IdentityUser, IdentityRole>(options => { // 原有Identity配置保持不变 }) .AddEntityFrameworkStores<你的项目DbContext类名>() .AddDefaultTokenProviders() .ConfigureApplicationCookie(options => { options.ExpireTimeSpan = TimeSpan.FromMinutes(20); options.SlidingExpiration = true; // 开启滑动过期,用户活跃时自动续期登录状态 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; // 生产环境使用HTTPS时需要开启 options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Lax; });
调整中间件加载顺序
你当前UseSession中间件放在了UseAuthentication、UseAuthorization之后,顺序错误会导致认证流程无法读取到会话数据,需要调整Configure方法的中间件顺序如下:
app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 调整顺序:会话缓存中间件放在认证授权之前 app.UseResponseCaching(); app.UseSession(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
检查服务器应用池配置
如果使用IIS部署,默认应用池20分钟无请求就会触发空闲超时回收,回收后内存中所有临时数据都会被清空,导致所有用户登录状态失效。需要进入IIS应用池高级设置,将【空闲超时(分钟)】设置为0(禁用空闲回收),同时关闭定期自动回收,或调整为低峰时段执行回收。
内容的提问来源于stack exchange,提问作者Mohammed Bahusayn
相关产品推荐
相关产品推荐

