#c# #.net #visual-studio #cookies #asp.net-core-mvc
Вопрос:
Я использую .NET Core и OpenID Connect, с файлами cookie, настроенными с SlidingExpiration = true
помощью и ExpireTimeSpan = 20 minutes
.
Что я наблюдаю, так это то, что, пока я работаю над задачей в приложении и не знаю, что срок действия билета cookie истек из-за ExpireTimeSpan
. Приложение не будет выполнять никаких функций, например: запрашивать у меня, что время истекает, или выходить из системы.
До сих пор я понимаю, что это SlidingExpiration
должно предоставить мне новый билет, если они обновят страницу на 10 минут или около того, но я замечаю, что это не так.
Поэтому мне интересно, могу ли я в любом случае продлить срок действия билета cookie до истечения срока действия, и задача/процесс должны быть прозрачными для меня. То, что я CookieAuthenticationHandler.cs
там замечаю, — это классный вызов функции OnCheckSlidingExpiration
. Мне интересно, как я должен использовать эту функцию в моем текущем приложении.
Ответ №1:
Согласно исходным кодам, я обнаружил, что метод OnCheckSlidingExpiration вызывается методом CheckForRefreshAsync от CookieAuthenticationHandler.
Исходные коды метода 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 amp;amp; expiresUtc != null amp;amp; Options.SlidingExpiration amp;amp; 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, я предлагаю вам попробовать переписать этот код.
Более подробно о том, как переписать этот метод, вы можете прочитать в этой статье.
Комментарии:
1. Да, то, что я тоже читаю. Но это только для .net 6 (если я не ошибаюсь). Я также прочитал ссылку, которую вы тоже предоставили, но, похоже, это большая работа для зрелого программного обеспечения, и я беспокоюсь, что что-то сломаю.
Ответ №2:
Прошло некоторое время, и я забыл ответить на свой ответ.
Я решил свою проблему с помощью ajax-скрипта:
- установите интервал в x секунд до истечения срока действия файла cookie, и как только время истечет, вызовите функцию.
- функция должна открыть еще одно небольшое окно(для обновления), а затем закрыть небольшое окно
- Файлы cookie обновились!
Пример ajax-скрипта: setInterval(функция () { Страница redirectrefreshsession(); }, 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>