ASP.NET Core 6.0 MVC如何设置身份验证令牌滚动过期时间
ASP.NET Core 6.0 MVC 个人用户账户模式配置令牌过期(支持滚动过期)
官方模板选Individual Accounts创建的项目,底层默认用ASP.NET Core Identity + Cookie认证实现身份校验,令牌过期、滚动过期都是原生支持的能力,不需要额外引入第三方组件,直接修改配置即可生效。
核心配置实现
找到项目根目录下的Program.cs文件,定位到AddDefaultIdentity服务注册的代码段,补充认证Cookie的相关配置即可:
// 模板默认生成的Identity注册代码,原有配置保留即可 builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); // 追加以下配置,设置令牌过期规则与滚动过期逻辑 builder.Services.ConfigureApplicationCookie(options => { // 基础有效期:用户无操作20分钟后令牌失效 options.ExpireTimeSpan = TimeSpan.FromMinutes(20); // 开启滚动过期:用户在有效期内发起任意请求,只要剩余有效期不足总时长的一半,就会自动刷新令牌、重置过期计时 options.SlidingExpiration = true; // 建议配置:绝对过期上限,无论用户是否持续活跃,到点必须重新登录,避免令牌永久有效的安全风险,示例设为最长7天 options.Cookie.MaxAge = TimeSpan.FromDays(7); // 以下路径模板默认已配置,无需修改 options.LoginPath = "/Identity/Account/Login"; options.AccessDeniedPath = "/Identity/Account/AccessDenied"; });
参数说明
ExpireTimeSpan:令牌基础有效期,即用户无操作的最长容忍时长,可根据业务场景调整:内部管理系统一般设30分钟,公开站点可设1-2小时SlidingExpiration:赋值为true即开启滚动过期,是核心需求对应的配置项。中间件会自动在请求满足刷新条件时颁发新令牌,不需要手写额外刷新逻辑Cookie.MaxAge:令牌绝对有效期上限,建议必须配置,避免用户长期保持活跃就永远不需要重新登录的安全隐患,一般按业务安全要求设7-30天即可
特殊场景适配(记住我功能)
如果项目启用了登录页的“记住我”功能,需要给持久化登录场景单独设置更长的有效期,可以修改登录页的后端逻辑(路径为Areas/Identity/Pages/Account/Login.cshtml.cs),在登录时传入自定义的认证属性:
// 替换默认的PasswordSignInAsync调用逻辑 if (Input.RememberMe) { var authProperties = new AuthenticationProperties { IsPersistent = true, // 记住我场景下,令牌最长有效期设为14天,仍然受滚动过期规则约束 ExpiresUtc = DateTimeOffset.UtcNow.AddDays(14), AllowRefresh = true }; await _signInManager.SignInAsync(user, authProperties); } else { // 非记住我场景走默认配置,即前面设置的20分钟无操作过期 await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, false, lockoutOnFailure: false); }
注意事项
- 不要把过期配置写在
AddDefaultIdentity的委托参数里,那个配置优先级低于ConfigureApplicationCookie的Cookie规则,容易出现配置不生效的问题 - 配置修改后重启应用即可,新登录的用户会直接应用新规则,已登录的旧用户会按原有令牌规则自然过期后切换到新规则
内容的提问来源于stack exchange,提问作者MikeT
相关产品推荐
相关产品推荐

