W ASP.NET, kiedy należy używać Session.Clear () zamiast Session.Abandon ()?

118

Zarówno Session.Clear (), jak i Session.Abandon () pozbywają się zmiennych sesji. Jak rozumiem, Abandon () kończy bieżącą sesję i powoduje utworzenie nowej sesji, powodując wywołanie zdarzeń End i Start.

W większości przypadków, na przykład wylogowywanie użytkownika, wydaje się lepsze wywołanie Abandon (). Czy są scenariusze, w których zamiast tego użyłbym Clear ()? Czy jest duża różnica w wydajności?

Lance Fisher
źródło

Odpowiedzi:

172

Session.Abandon() niszczy sesję i wyzwalane jest zdarzenie Session_OnEnd .

Session.Clear()po prostu usuwa wszystkie wartości (zawartość) z Object. Sesja z tym samym kluczem wciąż trwa.

Jeśli więc używasz Session.Abandon(), tracisz tę konkretną sesję, a użytkownik otrzyma nowy klucz sesji. Możesz go użyć na przykład, gdy użytkownik się wyloguje.

Użyj Session.Clear(), jeśli chcesz, aby użytkownik pozostał w tej samej sesji (jeśli na przykład nie chcesz, aby użytkownik ponownie się logował) i zresetuj wszystkie dane specyficzne dla sesji.

splattne
źródło
1
Uważam, że lepiej jest użyć RemoveAll () zamiast Clear (), ponieważ „Darin Dimitrov” zasugerował tutaj stackoverflow.com/a/3931344/713246
Bibhu,
4
@Bibhu: Jak zasugerował, że RemoveAll () była lepsza niż Clear ()? Jedyne, co zobaczyłem w jego odpowiedzi, to to, że RemoveAll () wywołuje Clear () i wydaje się działać identycznie.
Adam Miller,
1
Po prostu używane Session.Abandon()jako „wylogowanie” w wewnętrznej aplikacji przy użyciu uwierzytelniania systemu Windows - użytkownicy nie musieli ponownie uwierzytelniać się (Chrome, FF), ale sesja została usunięta i wydano nową, która spełniła moje wymagania
brichins
13

Tylko użycie Session.Clear (), gdy użytkownik się wyloguje, może stanowić lukę w zabezpieczeniach. Ponieważ sesja jest nadal ważna, jeśli chodzi o serwer WWW. W takim razie wąchanie, przechwycenie identyfikatora sesji i przejęcie tej sesji jest dość trywialną sprawą.

Z tego powodu podczas wylogowywania użytkownika bezpieczniejsze i rozsądniejsze byłoby użycie Session.Abandon (), aby sesja została zniszczona i utworzona nowa sesja (nawet jeśli strona wylogowania UI byłaby częścią nowej sesji, nowa sesja nie zawierałaby żadnych szczegółów użytkownika, a przechwycenie nowej sesji byłoby równoznaczne z posiadaniem nowej sesji, a zatem byłoby wyciszone).

shabbirh
źródło
4
Jaki byłby sens przechwytywania pustej sesji? Porywacz nadal musiałby się zalogować, a jego dane nie zostałyby przypadkowo przekazane nowemu użytkownikowi.
Trisped
3

Session.Abandonniszczy sesję, jak wspomniano powyżej, więc powinieneś tego używać podczas wylogowywania kogoś. Myślę, że dobrym zastosowaniem Session.Clearbyłby koszyk na zakupy w witrynie e-commerce. W ten sposób koszyk zostanie wyczyszczony bez wylogowania użytkownika.

Kasim Shafiq
źródło
Ale co, jeśli użyję Session.Abandontylko do wyczyszczenia konkretnego koszyka?
WTFZane
0

Miałem ten problem i próbowałem obu, ale musiałem zadowolić się usunięciem bzdur, takich jak „pageEditState”, ale nie usuwaniem informacji o użytkowniku, aby nie musieć ich ponownie sprawdzić.

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
MatthewMartin
źródło