【问题标题】:Refreshing cookie ticket in ASP.NET Core MVC在 ASP.NET Core MVC 中刷新 cookie 票证
【发布时间】:2021-08-25 10:09:35
【问题描述】:

我正在使用 .NET Core 和 OpenID Connect,cookie 配置为 SlidingExpiration = trueExpireTimeSpan = 20 minutes

我观察到的是,当我在应用程序中处理任务时,由于ExpireTimeSpan 而不知道 cookie 的票证已过期。应用程序不会执行任何功能示例:提示我时间快到了或注销。

到目前为止,我的理解是 SlidingExpiration 如果他们刷新页面 10 分钟左右,应该为我提供一张新票,但我注意到的情况并非如此。

所以我想知道我是否可以在过期之前更新 cookie 的票证,并且任务/流程对我来说应该是透明的。我注意到CookieAuthenticationHandler.cs 中有一个很酷的函数调用OnCheckSlidingExpiration。我想知道如何在我当前的应用程序中使用该功能。

【问题讨论】:

    标签: c# .net visual-studio cookies asp.net-core-mvc


    【解决方案1】:

    根据源码发现OnCheckSlidingExpiration方法是被CookieAuthenticationHandler的CheckForRefreshAsync方法调用的。

    CheckForRefreshAsync方法的源码如下:

        private async Task CheckForRefreshAsync(AuthenticationTicket ticket)
        {
            var currentUtc = Clock.UtcNow;
            var issuedUtc = ticket.Properties.IssuedUtc;
            var expiresUtc = ticket.Properties.ExpiresUtc;
            var allowRefresh = ticket.Properties.AllowRefresh ?? true;
            if (issuedUtc != null && expiresUtc != null && Options.SlidingExpiration && allowRefresh)
            {
                var timeElapsed = currentUtc.Subtract(issuedUtc.Value);
                var timeRemaining = expiresUtc.Value.Subtract(currentUtc);
    
                var eventContext = new CookieSlidingExpirationContext(Context, Scheme, Options, ticket, timeElapsed, timeRemaining)
                {
                    ShouldRenew = timeRemaining < timeElapsed,
                };
                await Options.Events.OnCheckSlidingExpiration(eventContext);
    
                if (eventContext.ShouldRenew)
                {
                    RequestRefresh(ticket);
                }
            }
        }
    

    如果您想编写自己的刷新cookie令牌的逻辑,我建议您可以尝试重写此处理程序。

    关于如何重写这个方法的更多细节,你可以参考这个article

    【讨论】:

    • 是的,我也读到了什么。但这仅适用于.net 6(除非我错了)。我也阅读了您提供的链接,但对于一个成熟的软件来说似乎需要做很多工作,我担心我会破坏一些东西。
    【解决方案2】:

    过了一段时间,我忘记回复我的答案了。

    我已经使用 ajax 脚本解决了我的问题:

    1. 在 cookie 过期前设置 x 秒的间隔,一旦时间到,调用该函数。
    2. 该函数应打开另一个小窗口(进行刷新),然后关闭小窗口
    3. Cookie 已刷新!

    ajax 脚本示例: setInterval(function () { redirectRefreshSessionPage(); }, 900000); //设置间隔为每15分钟

        function redirectRefreshSessionPage() {
        $.ajax({
            url: "{uri for refresh window}",
            method: "GET",
            dataType: "html"
        })
            .done(
                function (data) {
                    let options = { focus: false, keyboard: true };
                    $("#sessionModalWrapper").html(data);
                    $('#refresh page modal').modal(options);
                    $('#refresh page modal').modal('show');
                }
            );
        }
    </script>
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多