2010-09-17 11 views
33

Jestem zaskoczony, że nie mogłem znaleźć żadnych odpowiedzi.ustawić plik cookie, aby wygasł na koniec sesji? asp.net

Jak ustawić wartość sessionid w moim pliku cookie, aby wygasła po zakończeniu sesji? (kiedy przeglądarka się zamyka lub użytkownik był nieaktywny przez pewien czas).

Oba rozwiązania znalazłem były

(httpcookie).Expires = HttpContext.Current.Session.Timeout 

który dał mi błąd kompilacji, więc nie wiem, czy użytkownik sprawdził swój kod przed wysłaniem wiadomości. Drugim było ustawienie daty wygaśnięcia na 1 dzień temu, co według mnie jest błędne. Jak mam to zrobic?

+0

http://stackoverflow.com/questions/12582689/delete-cookies-on-session-timeout – Shurmajee

Odpowiedz

2

TimeOut zwraca int, Expires spodziewa się DateTime, dlatego ten kod się nie skompiluje. Ustawienie daty wygaśnięcia w przeszłości natychmiast anuluje plik cookie, więc prawdopodobnie nie jest to, czego chcesz. Jeśli nie wykorzystasz daty wygaśnięcia, ciasteczko wygaśnie, gdy tylko użytkownik zamknie przeglądarkę.

Jeśli chcesz, aby plik cookie był powiązany z konkretną sesją, po co w ogóle używać cookie? Z pewnością przedłużycie datę ważności pliku cookie za każdym razem, gdy użytkownik przedłuży sesję za pomocą aplikacji, ale wydaje się to niepotrzebną pracą. Po prostu skorzystaj z sesji.

Zapraszam do omówienia problemu.

+0

Jak mogę 'Wystarczy użyć Session'? –

+0

To oznaczało pomijanie rzeczy do pliku cookie i po prostu skorzystanie z sesji. Jeśli naprawdę potrzebujesz wiedzieć, jak * użyć * sesji, są na to pytania. Krótkim przykładem jest 'Session [" someKey "] = someString; string retrievedValue = (string) Session ["someKey"]; ' –

+0

+1. Chcę wspomnieć, że 'HttpContext.Current.Session' ma wartość null, więc zamiast tego poszedłam z ciasteczkami i przedłużam datę wygaśnięcia za każdym razem, gdy użytkownik odwiedza twoje wspomniane informacje. –

50

Mówisz o nietrwałym pliku cookie. Domyślnie asp.net wysyła ciasteczka w ten sposób. Główną różnicą między nimi jest to, że trwały plik cookie ma ustawioną wartość wygasania.

Tak więc, jeśli nie chcesz, aby plik cookie pozostał, nie ustawiaj wartości wygasania.

To powiedziawszy, plik cookie pozostanie w pamięci, dopóki przeglądarka nie zostanie faktycznie zamknięta. Załóżmy, że przeglądają witrynę i ustawiasz nietrwały plik cookie. Robią różne rzeczy i przeglądają. Później, używając tej samej instancji przeglądarki, wracają do Twojej witryny. Plik cookie nadal tam będzie.

Teraz, jeśli zamknęli przeglądarkę w dowolnym momencie, plik cookie zostanie przepłukany.

Punkt to, nie ustawiaj nagłówka wygasania. Zwłaszcza, gdy nie upłynie data sesji. Daty sesji to zazwyczaj około 20 minut w przyszłości, ale data wygaśnięcia przewija się do przodu, gdy użytkownik przegląda Twoją witrynę.

===== aktualizacja =====

Użyłem następujący kod do testowania:

protected void Page_Load(object sender, EventArgs e) { 
     if (!Page.IsPostBack) { 
      HttpCookie c = Request.Cookies["test"]; 
      if (c != null) { 
       Response.Write(String.Format("test value is {0} <br />", c.Value)); 
      } 
     } else { 
      HttpCookie c = new HttpCookie("test"); 
      c.Value = "HERE IT IS"; 
      Response.Cookies.Add(c); 
     } 
    } 

    protected void Button1_Click(object sender, EventArgs e) { 
     Response.Write("clicked<br />"); 
    } 

.aspx plik prosty przycisk, który miał opalane że obsługi button1_Click. Kiedy początkowo przeglądam to przy użyciu dowolnej z najnowszych przeglądarek (np. Firefox, chrome), nie ma pliku cookie. Po kliknięciu przycisku ustawiony jest plik cookie. Następnie całkowicie zamknąłem przeglądarkę, ponownie otworzyłem i ponownie przeglądałem stronę. We wszystkich przypadkach plik cookie zniknął.

+1

fajne, więc rozwiązaniem jest nic nie dotykać, po prostu ustaw wartość cookie i zostaw to. Myślałem, że to coś więcej. –

+1

Nie. To całkiem proste. – NotMe

+0

Zanim zaznaczę to jako zaakceptowane, chcę je poznać. Zamknąłem przeglądarkę Firefox (3.6.10) i ponownie ją otworzyłem. Nadal byłem zalogowany. Dlaczego? Wygląda na to, że aktualizacja/ustawienie czasu wygaśnięcia do 30 minut wcześniej wydaje się dobrym rozwiązaniem. –

8

Należy pamiętać, że w dzisiejszych czasach nie można liczyć na usunięcie pliku cookie sesji, gdy użytkownik zamyka przeglądarkę. Zarówno Chrome, jak i Firefox wprowadziły tę zmianę w 2012 roku - zobacz różne linki pod adresem this answer.

Teraz, nieudane usuwanie plików cookie sesji, jest dla mnie strasznym, okropnym, niezłym, bardzo złym luką w zabezpieczeniach, nie wspominając o naruszeniu wszystkich istotnych dokumentów RFC, ale najwyraźniej nasi overlords Google (i Mozilli) wiedzą lepiej.

Nie jestem pewien, jakie jest najlepsze rozwiązanie, ale podejście, które podejmuję, polega na resetowaniu właściwości "Wygasa" w pliku cookie do godziny w przyszłości po każdym wywołaniu. Nie jest to dokładnie pożądane zachowanie, ale myślę, że jest to lepsze niż zezwolenie na trwałe pliki cookie, które zasadniczo trwają wiecznie.

Otwarte na inne sugestie lub wyjaśnienia.

+0

Jeśli poświęcisz dużo czasu na tworzenie pliku Cookie, może to być ratowanie życia w opartym na żądaniach równoważeniu obciążenia. Oczywiście nic nie jest w 100% bezpieczne, ale pakiet Encrypted Ticket wewnątrz Cookie to najlepsze podejście bez stosowania innych schematów zaciemniania. – GoldBishop

1

NIE używaj kontroli logowania, utrudnia to.

protected void btnLogin_Click(object sender, EventArgs e) 
{ 
    // Check user and password in database 
    bool isValidUser = ValidateUser(txtUsername.Text, txtPassword.Text); 

    // Set cookie to be not persistent - this means if the user closes the browser, 
    //autentification cookie will be deleted and the user is not longer logged 
    bool isPersistentCookie = false; 

    // Login user with the new username 
    FormsAuthentication.SetAuthCookie(txtUsername.Text, isPersistentCookie); 
} 
Powiązane problemy