2012-04-27 3 views
18

Próbuję uzyskać głowę wokół celu isPersistent Właściwość znaleziona w klasie FormsAuthenticationTicket. http://msdn.microsoft.com/en-us/library/kybcs83h.aspxJaki jest cel właściwości FormsAuthenticationTicket jest właściwośćPersistent?

  1. Czy istnieją scenariusze podczas ustawiania trwałych prac?
  2. W jakich sytuacjach chciałbym ustawić isPersistent na true i false?

Obiekt wydaje się być zbędne, ponieważ znalazłem jedyny sposób dla mnie utrzymywać mój plik cookie uwierzytelniania użytkowników w całej sesji przeglądarki jest ustawić właściwość cookie utworzone w wyniku tworzenia biletów Expires; nawet jeśli wartość biletów jest wyższa niż false.

Zauważyłem również, że ustawienie daty wygaśnięcia biletu (nie ciasteczka) na coś podobnego do 10 sekund z isPersistent ustawionym na true ma niewielki wpływ; bilet wygasa po 10 sekundach.

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, 
    identity.Name, 
    DateTime.Now, 
    DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes), 
    isPersistent, 
    JsonSerializerService.ToJson(identity), 
    FormsAuthentication.FormsCookiePath); 

string encryptedTicket = FormsAuthentication.Encrypt(ticket); 

var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 

cookie.Path = FormsAuthentication.FormsCookiePath; 

cookie.Expires = DateTime.Now.AddYears(1); // good for one year 

Rozumiem, że mogę zmienić mój powyższy kod do opcjonalnie ustawić expires

if (isPersistent) 
    cookie.Expires = DateTime.Now.AddYears(1); // good for one year 

Przykładem wniosek został stworzony @ GitHub. https://github.com/chrismoutray/AuthSample Zasadniczo pokazuje to, że nawet ustawiając flagę isPersistent na wartość true autoryzacja dla przeglądarki krzyżowej nie działa.

Odpowiedz

9

W środowisku 1.0/1.1 ustawienie IsPersistent na wartość true ustawiłoby ciasteczko na okres 50 lat.
W wersji 2.0 została zmieniona, więc wygaśnięcie pliku cookie pasuje do atrybutu timeout uwierzytelniania formularza. Możesz ustawić wartość IsPersistent na true, ale ciasteczko zawsze wygasa po upływie limitu czasu uwierzytelniania formularza.
Twój kod wykonuje lewę, jeśli chcesz mieć długi okres ważności bez modyfikowania limitu czasu uwierzytelniania formularzy.

edit: Pobrałem swoje próbki i zastępuje kod cookie z

FormsAuthentication.SetAuthCookie(model.UserName, true); 

I to działa zgodnie z oczekiwaniami: dwa dni skonfigurowany jako limit czasu formy, mój plik cookie wygasa w ciągu dwóch dni.

+0

Czuję, że czegoś mi brakuje, ciasteczko nie przetrwa, chyba że specjalnie ustawię pole "Ważność" plików cookie. Ustawienie IsPersistent nie daje żadnego efektu. –

+0

Jeśli ustawisz wartość IsPersistent na true, wygenerowany plik cookie będzie miał datę wygaśnięcia + teraz limit czasu. To nie twoja sprawa? – lnu

+0

No no - jeśli usunę linię 'cookie.Expires = DateTime.Now.AddYears (1);' moja funkcja logowania mnie nie działa, nawet jeśli isPersistent jest ustawione na true. –