我正在使用 .NET Core 和 OpenID Connect,并且 cookie 配置为
SlidingExpiration = true
和 ExpireTimeSpan = 20 minutes
。
我观察到,当我在应用程序中执行任务时,并不知道 cookie 的票证由于
ExpireTimeSpan
已过期。应用程序不会执行任何功能示例:提示我时间即将到期或注销。
到目前为止我的理解是,如果他们刷新页面 10 分钟左右,
SlidingExpiration
应该为我提供一张新票,但我注意到情况并非如此。
所以我想知道我是否可以在过期之前更新 cookie 的票证,并且任务/流程对我来说应该是透明的。我注意到
CookieAuthenticationHandler.cs
有一个很酷的函数调用 OnCheckSlidingExpiration
。我想知道我应该如何在当前的应用程序中使用该功能。
根据源码,我发现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 逻辑,我建议你可以尝试重写这个处理程序。
更多关于如何重写这个方法的细节,你可以参考这篇文章。
已经有一段时间了,我忘记回复我的答案了。
我已经使用ajax脚本解决了我的问题:
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>
我知道这现在已经相当老了,但添加了我自己的答案,因为我花了很多时间试图解决类似的问题,并觉得它可能会有所帮助。在 .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