.NET Core 3.1中如何获取CookieAuthentication的Cookie续期信息?
你的问题出在对context.ShouldRenew触发条件的理解,以及默认滑动过期逻辑的阈值设置上。
为什么ShouldRenew一直返回false?
默认情况下,Cookie认证中间件的**滑动过期(SlidingExpiration)**逻辑是:只有当当前请求时,Cookie的剩余过期时间小于ExpireTimeSpan的一半时,才会自动将ShouldRenew设为true。你的代码里ExpireTimeSpan设为10秒,意味着只有当Cookie剩余时间小于5秒时,续期逻辑才会触发,ShouldRenew才会变为true。如果测试时请求发起得太早(比如Cookie刚生成3秒就请求),剩余时间大于5秒,自然不会触发续期,ShouldRenew保持false。
正确获取续期信息的方式
根据需求,有两种方案可选:
方案1:依赖默认滑动过期逻辑,调整测试场景
确保测试请求在Cookie剩余时间小于ExpireTimeSpan一半时发起。比如设置ExpireTimeSpan = TimeSpan.FromSeconds(10),就在Cookie生成6秒后发起请求,此时剩余时间4秒,小于5秒,ShouldRenew会自动变为true,你的日志代码就能执行。
方案2:自定义续期判断逻辑
如果需要更灵活的续期条件(不依赖默认的一半阈值),可以手动计算剩余时间并设置ShouldRenew,或者通过OnCheckSlidingExpiration事件控制:
方式A:在OnValidatePrincipal中手动判断
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = new PathString("/Member/Login"); options.SlidingExpiration = true; options.ExpireTimeSpan = TimeSpan.FromSeconds(10); options.Events = new CookieAuthenticationEvents { OnValidatePrincipal = context => { var expiresUtc = context.Properties.ExpiresUtc; if (expiresUtc.HasValue) { // 计算Cookie剩余过期时间 var timeRemaining = expiresUtc.Value - DateTimeOffset.UtcNow; // 自定义续期阈值:比如剩余时间小于3秒时触发续期 if (timeRemaining < TimeSpan.FromSeconds(3)) { context.ShouldRenew = true; Console.WriteLine("Cookie expire time will be updated"); // 在这里添加你的自定义续期逻辑 } } return Task.CompletedTask; } }; });
方式B:通过OnCheckSlidingExpiration控制续期
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = new PathString("/Member/Login"); options.SlidingExpiration = true; options.ExpireTimeSpan = TimeSpan.FromSeconds(10); options.Events = new CookieAuthenticationEvents { OnCheckSlidingExpiration = context => { var expiresUtc = context.Properties.ExpiresUtc; if (expiresUtc.HasValue) { var timeRemaining = expiresUtc.Value - DateTimeOffset.UtcNow; // 自定义续期条件,设置ShouldRenew context.ShouldRenew = timeRemaining < TimeSpan.FromSeconds(3); } return Task.CompletedTask; }, OnValidatePrincipal = context => { if (context.ShouldRenew) { Console.WriteLine("Cookie expire time should be updated"); } return Task.CompletedTask; } }; });
注意事项
- 当
context.ShouldRenew设为true后,Cookie认证中间件会自动更新Cookie的过期时间,无需手动操作Cookie; - 滑动过期仅在用户发起请求时触发,若用户长时间无请求,Cookie仍会正常过期。
内容的提问来源于stack exchange,提问作者Vic
相关产品推荐
相关产品推荐

