在 ASP.NET Core MVC 中刷新 cookie 票证

问题描述 投票:0回答:3

我正在使用 .NET Core 和 OpenID Connect,并且 cookie 配置为

SlidingExpiration = true
ExpireTimeSpan = 20 minutes

我观察到,当我在应用程序中执行任务时,并不知道 cookie 的票证由于

ExpireTimeSpan
已过期。应用程序不会执行任何功能示例:提示我时间即将到期或注销。

到目前为止我的理解是,如果他们刷新页面 10 分钟左右,

SlidingExpiration
应该为我提供一张新票,但我注意到情况并非如此。

所以我想知道我是否可以在过期之前更新 cookie 的票证,并且任务/流程对我来说应该是透明的。我注意到

CookieAuthenticationHandler.cs
有一个很酷的函数调用
OnCheckSlidingExpiration
。我想知道我应该如何在当前的应用程序中使用该功能。

c# .net visual-studio cookies asp.net-core-mvc
3个回答
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 token 逻辑,我建议你可以尝试重写这个处理程序。

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


0
投票

已经有一段时间了,我忘记回复我的答案了。

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

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

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>

0
投票

我知道这现在已经相当老了,但添加了我自己的答案,因为我花了很多时间试图解决类似的问题,并觉得它可能会有所帮助。在 .NET 6 中,您可以重写默认的 cookie 身份验证事件方法,其中之一是提到的 OnCheckSlidingExpiration。您需要在项目的 Program.cs 文件中更新此内容,我个人在配置应用程序 cookie 时这样做了,如下所示:

builder.Services.ConfigureApplicationCookie(options =>
{
    options.Events.OnCheckSlidingExpiration = context =>
    {
        var path = context.Request.Path.Value;
        context.ShouldRenew = context.ElapsedTime > (context.Options.ExpireTimeSpan / 2);

        if (path == "/PathWeDontWantToRenewExpiration")
        {
            context.ShouldRenew = false;
        }

        return Task.CompletedTask;
    };
});

重要的是要包含更新 cookie 过期时间的默认功能,否则过期时间根本不会更新,在这段代码中我基本上是说“如果经过的时间超过过期时间跨度的一半,它应该更新,除非调用“/PathWeDontWantToRenewExpiration”。

我还在 .NET Core GitHub Repo 中找到了一些示例:https://github.com/dotnet/aspnetcore/blob/main/src/Security/Authentication/Cookies/samples/CookieSample/Program.cs

© www.soinside.com 2019 - 2024. All rights reserved.