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

.NET Core 3.1中如何获取CookieAuthentication的Cookie续期信息?

.NET Core 3.1 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:32:32