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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 03:39:03