In ASP.NET, quando dovrei usare Session.Clear () invece di Session.Abandon ()?


118

Sia Session.Clear () che Session.Abandon () eliminano le variabili di sessione. A quanto ho capito, Abandon () termina la sessione corrente e provoca la creazione di una nuova sessione provocando l'attivazione degli eventi End e Start.

Sembra preferibile chiamare Abandon () nella maggior parte dei casi, ad esempio disconnettendo un utente. Ci sono scenari in cui invece userei Clear ()? C'è molta differenza di prestazioni?

Risposte:


172

Session.Abandon() distrugge la sessione e viene attivato l' evento Session_OnEnd .

Session.Clear()rimuove solo tutti i valori (contenuto) dall'oggetto. La sessione con la stessa chiave è ancora viva.

Quindi, se usi Session.Abandon(), perdi quella sessione specifica e l'utente riceverà una nuova chiave di sessione. Potresti usarlo ad esempio quando l'utente si disconnette.

Utilizzare Session.Clear(), se si desidera che l'utente rimanga nella stessa sessione (se ad esempio non si desidera che l'utente effettui nuovamente l'accesso) e reimpostare tutti i dati specifici della sessione.


1
Credo meglio usare RemoveAll () invece di Clear (), come "Darin Dimitrov" ha suggerito qui stackoverflow.com/a/3931344/713246
Bibhu

4
@Bibhu: come ha suggerito che RemoveAll () fosse migliore di Clear ()? Tutto quello che ho visto nella sua risposta è stato che RemoveAll () chiama Clear () e sembra essere funzionalmente identico.
Adam Miller

1
Usato solo Session.Abandon()come "logout" su un'app interna utilizzando l'autenticazione di Windows: gli utenti non dovevano autenticarsi nuovamente (Chrome, FF), ma la sessione è stata eliminata e ne è stata emessa una nuova, che ha soddisfatto i miei requisiti
brichins

13

Solo l'utilizzo di Session.Clear () quando un utente si disconnette può rappresentare un buco di sicurezza. Poiché la sessione è ancora valida per quanto riguarda il Web Server. È quindi una questione ragionevolmente banale annusare, prendere l'ID della sessione e dirottare quella sessione.

Per questo motivo, quando si effettua il logout di un utente sarebbe più sicuro e più sensato utilizzare Session.Abandon () in modo che la sessione venga distrutta e ne venga creata una nuova (anche se la pagina dell'interfaccia utente di logout farà parte della nuova sessione, la nuova sessione non avrebbe nessuno dei dettagli dell'utente e dirottare la nuova sessione equivarrebbe ad avere una nuova sessione, quindi sarebbe muto).


4
Che senso avrebbe dirottare una sessione vuota? Il dirottatore dovrebbe comunque accedere e non ci sono dati da fornire accidentalmente al nuovo utente.
Trisped

3

Session.Abandondistrugge la sessione come indicato sopra, quindi dovresti usarlo quando disconnetti qualcuno. Penso che un buon uso di Session.Clearsarebbe per un carrello della spesa su un sito di e-commerce. In questo modo il carrello viene svuotato senza disconnettere l'utente.


Ma cosa succede se utilizzo Session.Abandonsolo per cancellare un carrello della spesa specifico?
WTFZane

0

Ho avuto questo problema e ho provato entrambi, ma ho dovuto accontentarmi di rimuovere schifezze come "pageEditState", ma non rimuovere le informazioni dell'utente per non doverle cercare di nuovo.

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.