Еще одна проблема с слишком ранним сроком действия билета аутентификации форм. Мне нужно использовать скользящее значение 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);
}
Мои вопросы:
Спасибо, С уважением,