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
相关产品推荐
相关产品推荐

