Продление билета проверки подлинности с помощью форм вручную:

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

Проблема: В моей веб-конфигурации у меня есть следующее:

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

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

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

    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);
    }

Мои вопросы:

  1. Является ли это неправильным или приемлемым решением, сбрасывать куки при каждом запросе?
  2. Почему это до сих пор не работает? Кажется, что новый Билет никогда не продлевается.
  3. Существуют ли другие возможные причины слишком раннего истечения срока действия аутентификации пользователей с помощью форм, которые мне следует исследовать?

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

11
задан thevan 8 June 2012 в 18:39
поделиться