Освежающий билет на печенье в ASP.NET Основной MVC

#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-скрипта:

  1. установите интервал в x секунд до истечения срока действия файла cookie, и как только время истечет, вызовите функцию.
  2. функция должна открыть еще одно небольшое окно(для обновления), а затем закрыть небольшое окно
  3. Файлы 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>