2011-02-03 18 views
8

To jest moja funkcja, która jest wywoływana, gdy logowanie się powiedzie. (Jestem bardzo nowy w tym FormAuthentication rzeczy)FormsAuthenticationTicket wygasa zbyt wcześnie

public static void CreateLoginCookie(User u) 
{ 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(u.Id.ToString(), true, 9*60); 
    string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Expires = DateTime.Now.AddHours(9) }; 
    HttpContext.Current.Response.Cookies.Add(cookie); 
} 

W web.config mam

<authentication mode="Forms"> 
    <forms loginUrl="~/Default/Login" timeout="540" /> 
</authentication> 

chcę pobyt użytkownik zalogowany do 9 godzin, ale to nie działa. Zostają wylogowani po godzinie lub dwóch.

Czy ktoś może mi powiedzieć, czego mi brakuje?

+2

Czy jesteś pewien, że to bilet, a nie to, że sesja wygasa? –

Odpowiedz

1

Czy spojrzałeś na modyfikację limitu czasu w pliku web.config?

<forms 
    name="name" 
    loginUrl="URL" 
    defaultUrl="URL" 
    protection="[All|None|Encryption|Validation]" 
    timeout="[MM]" 
    path="path" 
    requireSSL="[true|false]" 
    slidingExpiration="[true|false]"> 
    enableCrossAppRedirects="[true|false]" 
    cookieless="[UseUri|UseCookies|AutoDetect|UseDeviceProfile]" 
    domain="domain name" 
    ticketCompatibilityMode="[Framework20|Framework40]"> 
    <credentials>...</credentials> 
</forms> 
+0

Tak, dziękuję, mam 540 jako limit czasu, ale to nie zadziałało. Zaktualizowałem pytanie. – Aximili

+0

Mam coś do powiedzenia. Czy korzystasz z protokołu SSL? – Victor

+0

Nie, bez SSL tutaj – Aximili

1

Używałem ten fragment i to działa na mnie, spójrz na to:

 FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket( 
               1,          // Ticket version 
               username,         // Username associated with ticket 
               DateTime.Now,        // Date/time issued 
               DateTime.Now.AddDays(1),     // Date/time to expire 
               isPersistent,        // "true" for a persistent user cookie 
               dataStore,        // User-data, in this case the roles 
               FormsAuthentication.FormsCookiePath);  // Path cookie valid for 

     // Encrypt the cookie using the machine key for secure transport 
     string Hash = FormsAuthentication.Encrypt(Ticket); 
     HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, Hash); 

     // Set the cookie's expiration time to the tickets expiration time 
     if (Ticket.IsPersistent) 
      Cookie.Expires = Ticket.Expiration; 
3

Może się zdarzyć, ponieważ recyklingu Application Pool.

Plik cookie uwierzytelniania jest szyfrowany za pomocą klawiszy komputera. Wygląda na to, że te klucze maszynowe są domyślnie generowane przy każdym ponownym uruchomieniu puli aplikacji. Następnie aplikacja jest nieaktywna przez pewien czas (skonfigurowana w ustawieniach puli aplikacji), a pula aplikacji jest ponownie przetwarzana.

Musisz wygenerować statyczne klucze maszyny.

To pytanie jest związane z Ciebie: Can a FormsAuthenticationTicket survive an app pool recycle?

Powiązane problemy