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

ASP.NET Core Identity认证Cookie无法保持登录状态问题求助

解决ASP.NET Core Identity“记住我”功能提前失效的问题

根据你的描述,Cookie显示正确的30天过期时间,但10-15分钟后就被强制登出,这种情况通常是服务器端的认证票据验证失败导致的,而非客户端Cookie过期。下面是几个最可能的原因和对应的解决方案:

1. IIS应用程序池回收(最常见原因)

如果你的网站部署在IIS上,默认的应用程序池会设置20分钟无活动自动回收。回收后,服务器端用于加密认证Cookie的Data Protection密钥会丢失(默认存在内存中),导致无法解密之前生成的Cookie——服务器会判定用户未认证,从而重定向到登录页。

解决方案:持久化Data Protection密钥

在ConfigureServices中添加配置,将密钥存储到持久化位置(比如本地文件系统),避免应用池回收后密钥丢失:

using Microsoft.AspNetCore.DataProtection;

public void ConfigureServices(IServiceCollection services)
{
    // 其他配置保持不变...

    // 持久化密钥到项目目录下的专用文件夹
    var keyStoragePath = Path.Combine(Directory.GetCurrentDirectory(), "DataProtection-Keys");
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(keyStoragePath))
        .SetApplicationName("YourSiteName"); // 统一应用名称,确保密钥上下文一致

    // 其他配置保持不变...
}

如果是多服务器部署,需要使用共享存储(如网络共享文件夹、云存储)来存储密钥,保证所有服务器用相同密钥解密Cookie。

2. SecurityStampValidator验证间隔过短

ASP.NET Core Identity的SecurityStampValidator会定期验证用户的安全戳(SecurityStamp),默认间隔是30分钟。如果服务器端的安全戳缓存失效(比如应用重启),会触发强制登出。虽然你的失效时间略短于默认间隔,但延长验证间隔可以减少这类问题的发生。

解决方案:调整验证间隔

在ConfigureServices中添加配置:

services.Configure<SecurityStampValidatorOptions>(options =>
{
    // 根据需求调整,比如设置为24小时
    options.ValidationInterval = TimeSpan.FromHours(24);
});

3. 确认“记住我”参数正确传递

虽然你的代码已经将model.RememberMe传入PasswordSignInAsync,但建议加日志确认参数值,避免前端表单绑定错误(比如复选框的name属性和模型字段不匹配):

[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginModel model)
{
    if (ModelState.IsValid)
    {
        // 日志输出确认参数值
        _logger.LogInformation("用户勾选记住我状态: {Status}", model.RememberMe);
        
        var result = await _signInManager.PasswordSignInAsync(model.EmailAddress, model.Password, model.RememberMe, false);
        if (result.Succeeded)
            return RedirectToAction("index", "links");
        ModelState.AddModelError(string.Empty, "Invalid login");
    }
    return View(model);
}

额外检查项

  • 确认ConfigureApplicationCookie的调用顺序:必须在AddIdentity之后(你的代码顺序是正确的,这样才能覆盖默认Cookie配置)。
  • 检查服务器与客户端时钟是否一致:如果服务器时钟比客户端快很多,可能导致Cookie在服务器端被判定为过期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:17:39