.NET Core认证Cookie能否设置自定义自动续期阈值?
首先可以明确:ASP.NET Core 自带的 Cookie 认证组件没有提供公开的配置参数直接修改默认的滑动过期阈值(默认的过半续期逻辑是组件内部硬编码的),但你可以通过自定义认证事件的方式实现任意自定义的续期规则。
实现自定义续期的核心方法
你可以通过配置 Cookie 认证的OnValidatePrincipal事件,自行判断是否需要触发 Cookie 续期,只要将上下文的ShouldRenew属性设为true,组件就会自动帮你重新颁发带有新过期时间的 Cookie。
场景1:每次请求都自动续期
直接在事件中将ShouldRenew固定设为true即可:
services.AddAuthentication() .AddCookie(op => { op.ExpireTimeSpan = TimeSpan.FromHours(2); // 配置Cookie的总有效时长 // 可以关闭自带的滑动过期逻辑,避免和自定义逻辑冲突 op.SlidingExpiration = false; op.Events.OnValidatePrincipal = context => { // 强制每次请求都触发续期 context.ShouldRenew = true; return Task.CompletedTask; }; });
场景2:自定义固定时间阈值续期
比如你要设置Cookie颁发时长超过X分钟就触发续期,只需要在事件中计算Cookie已经生效的时长,满足阈值就触发续期即可:
services.AddAuthentication() .AddCookie(op => { op.ExpireTimeSpan = TimeSpan.FromHours(2); // 配置Cookie的总有效时长 op.SlidingExpiration = false; op.Events.OnValidatePrincipal = context => { // 校验Cookie颁发时间是否存在 if (context.Properties.IssuedUtc.HasValue) { // 计算Cookie已经生效的时长 var elapsedTime = DateTimeOffset.UtcNow - context.Properties.IssuedUtc.Value; // 自定义阈值:比如超过15分钟就续期,可按需修改 if (elapsedTime >= TimeSpan.FromMinutes(15)) { context.ShouldRenew = true; } } return Task.CompletedTask; }; });
注意事项
- 续期后新Cookie的过期时间会按照你配置的
ExpireTimeSpan重新计算,相当于每次续期都将Cookie的有效时长往后延长了完整的ExpireTimeSpan时长 - 如果你同时开启了自带的
SlidingExpiration,组件自带的过半续期逻辑和你的自定义逻辑会同时生效,只要其中一个条件满足就会触发续期,不需要的话建议将SlidingExpiration设为false - 不需要你手动操作Cookie的写入、加密等逻辑,只要设置
ShouldRenew = true,认证组件会自动完成所有后续操作
内容的提问来源于stack exchange,提问作者Master_T
相关产品推荐
相关产品推荐

