2012-06-08 10 views
10

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:

  1. Czy to źle lub akceptowalne rozwiązanie, resetowanie cookie na każde żądanie?
  2. Dlaczego to nadal nie działa? Wygląda na to, że nowy bilet nigdy się nie odnawia.
  3. Czy istnieją inne możliwe przyczyny, ponieważ użytkownicy mają zbyt wcześnie utracone uwierzytelnianie formularzy, które powinienem zbadać?

Dziękuję Pozdrowienia,

+0

jakiej wersji framework i IIS używasz? –

+0

docelowa struktura projektu to 4,0. Wersja IIS to 7, ale testuję na serwerze Visual Studio 2010 wbudowanym serwerze –

+0

Myślę, że powinieneś nadać atrybut domain w tagu formularzy. Nie trzeba zapisywać plików cookie odnawiających na każde żądanie. –

Odpowiedz

14

uwierzytelniania formularzy cookies odnawia się dopiero po pół nadszedł czas ważności upłynął.

z Microsoft:

Jeśli strona internetowa jest dostępna przed połowę czasu ważności mija, czas ważności biletu nie zostaną zresetowane. Na przykład, jeśli jakakolwiek strona Web zostanie ponownie otwarta o 5:04 00:00:00 po południu, okres ważności plików cookie i biletu nie zostanie zresetowany.

Aby zapobiec zagrożeniu i uniknąć wielu przeglądarek ostrzeżenia dla użytkowników, którzy mają ostrzeżenia cookie, plik cookie jest zaktualizowany po upływie ponad połowy określonego czasu.

To może być Twój problem. Jeśli Twoi klienci uzyskają dostęp do Twojej witryny po 9 minutach i nie uzyskają do niej dostępu przez 10 minut, przekroczą limit czasu. Dzieje się tak, mimo że limit czasu sesji został ustawiony na 20 minut.

Ręczne odnawianie biletu tak, jak robisz, nie jest konieczne. Po prostu musisz włączyć wygaszanie wygaszania. Jeśli zasada "połowa czasu określonego" nie działa dla Ciebie, musisz przyjrzeć się innym rozwiązaniom.

+1

Uruchomiliśmy ten sam problem. Wpadłem na artykuł MS przed tym artykule. Masa informacji jest tutaj. https://support.microsoft.com/en-us/kb/910443 – Shrini

Powiązane problemy