Kolejny problem z biletem autoryzacyjnym do formularzy wygasa zbyt wcześnie. Potrzebuję ustawić wartość wygasania na wartość true. Przeczytałem fora i zrozumiałem problem z utratą precyzji, że bilet jest aktualizowany tylko wtedy, gdy prośba została złożona po upływie połowy czasu wygaśnięcia.Bilet odnawiania formularzy odnawiany ręcznie:
problem: W moim webconfig Mam następująco:
<authentication mode="Forms">
<forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" />
</authentication>
<sessionState timeout="20" />
<authorization>
Użytkownik musi być zalogowany tylko i przekierowany do Login.aspx, tylko wtedy, gdy nie było żądanie wykonane w odstępie 20 minut. Problem polega na tym, że użytkownicy wysyłają żądania i nadal są wysyłani na stronę logowania. To nie powinno się zdarzyć. Myślałem o tym, aby ręcznie zresetować SqlAuthCookie dla każdego żądania.
Poniżej znajduje się mój kod. Jest wywoływany w context.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);
}
Moje pytania są następujące:
- Czy to źle lub akceptowalne rozwiązanie, resetowanie cookie na każde żądanie?
- Dlaczego to nadal nie działa? Wygląda na to, że nowy bilet nigdy się nie odnawia.
- Czy istnieją inne możliwe przyczyny, ponieważ użytkownicy mają zbyt wcześnie utracone uwierzytelnianie formularzy, które powinienem zbadać?
Dziękuję Pozdrowienia,
jakiej wersji framework i IIS używasz? –
docelowa struktura projektu to 4,0. Wersja IIS to 7, ale testuję na serwerze Visual Studio 2010 wbudowanym serwerze –
Myślę, że powinieneś nadać atrybut domain w tagu formularzy. Nie trzeba zapisywać plików cookie odnawiających na każde żądanie. –