Вручную обновить бланк проверки подлинности:

Еще одна проблема с истечением срока действия билета проверки подлинности. Мне нужно использовать скользящее истечение, установленное в true. Я читал форумы и понимал проблему с потерей точности, что билет обновляется только в том случае, если запрос выполняется только после половины срока действия.

Проблема: В моем webconfig у меня есть следующее:

    <authentication mode="Forms">
        <forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" />
    </authentication>
    <sessionState timeout="20" />
    <authorization>

Пользователь должен быть выведен из системы и перенаправлен только на login.aspx, только если запрос не был запрошен в 20-минутном интервале. Проблема в том, что пользователи делают запросы и все равно попадают на страницу входа. Этого не должно быть. То, что я думал делать, было для reset SqlAuthCookie вручную для каждого запроса.

Ниже мой код. Он вызывается в контексте .CquireRequestState.

    void context_AcquireRequestState(object sender, EventArgs e)
    {
        HttpContext ctx = HttpContext.Current;
        ResetAuthCookie(ctx);
     }

            private void ResetAuthCookie(HttpContext ctx)
    {
        HttpCookie authCookie = ctx.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie == null)
            return;

        FormsAuthenticationTicket ticketOld = FormsAuthentication.Decrypt(authCookie.Value);
        if (ticketOld == null)
            return;

        if (ticketOld.Expired)
            return;

        FormsAuthenticationTicket ticketNew = null;
        if (FormsAuthentication.SlidingExpiration)
           ticketNew = FormsAuthentication.RenewTicketIfOld(ticketOld);

        if (ticketNew != ticketOld)
            StoreNewCookie(ticketNew, authCookie, ctx);
    }

    private void StoreNewCookie(FormsAuthenticationTicket ticketNew, HttpCookie authCookie, HttpContext ctx)
    {
        string hash = FormsAuthentication.Encrypt(ticketNew);
        if (ticketNew.IsPersistent)
            authCookie.Expires = ticketNew.Expiration;

        authCookie.Value = hash;
        authCookie.HttpOnly = true;

        ctx.Response.Cookies.Add(authCookie);
    }

Мои вопросы:

  • Это неправильно или приемлемое решение, сбросив файл cookie по каждому запросу?
  • Почему он все еще не работает? Кажется, что новый билет никогда не обновляется.
  • Возможны ли другие причины, поскольку слишком скоро срок полномочий пользователей истекает, и я должен исследовать их?

Спасибо, С уважением,

Ответ 1

Файл cookie аутентификации форм обновляется только после того, как прошло половина времени истечения.

От Microsoft:

Если веб-страница будет доступна до того, как пройдет половина времени истечения срока действия, срок действия билета не будет reset. Например, если какой-либо веб-сайт страница открывается снова в 5:04 00:00:00 PM, файлы cookie и билет период ожидания не будет reset.

Чтобы предотвратить скомпрометированную производительность и избежать использования нескольких браузеров предупреждения для пользователей, у которых есть предупреждения о файлах cookie, cookie обновляется, когда прошло более половины указанного времени.

Это может быть ваша проблема. Если ваши клиенты получают доступ к вашему сайту с отметкой в ​​9 минут и не получают доступ к нему снова в течение 10 минут, они будут отключены. Это происходит, даже если у вас установлен тайм-аут сеанса до 20 минут.

Вручную обновлять билет, как вы делаете, не требуется. Вам просто нужно скользящее выключение. Если правило "половина определенного времени" не работает для вас, вам придется искать другие решения.