Wann sollte ich in ASP.NET Session.Clear () anstelle von Session.Abandon () verwenden?

118

Sowohl Session.Clear () als auch Session.Abandon () entfernen Sitzungsvariablen. Nach meinem Verständnis beendet Abandon () die aktuelle Sitzung und bewirkt, dass eine neue Sitzung erstellt wird, wodurch die Ereignisse End und Start ausgelöst werden.

In den meisten Fällen ist es vorzuziehen, Abandon () aufzurufen, z. B. um einen Benutzer abzumelden. Gibt es Szenarien, in denen ich stattdessen Clear () verwenden würde? Gibt es einen großen Leistungsunterschied?

Lance Fisher
quelle

Antworten:

172

Session.Abandon() zerstört die Sitzung und das Session_OnEnd-Ereignis wird ausgelöst.

Session.Clear()Entfernt einfach alle Werte (Inhalte) aus dem Objekt. Die Sitzung mit demselben Schlüssel ist noch aktiv.

Wenn Sie also verwenden Session.Abandon(), verlieren Sie diese bestimmte Sitzung und der Benutzer erhält einen neuen Sitzungsschlüssel. Sie können es beispielsweise verwenden, wenn sich der Benutzer abmeldet.

Verwenden Session.Clear()Sie diese Option, wenn der Benutzer in derselben Sitzung verbleiben soll (wenn Sie beispielsweise nicht möchten, dass sich der Benutzer erneut anmeldet), und setzen Sie alle sitzungsspezifischen Daten zurück.

splattne
quelle
1
Ich glaube besser, RemoveAll () anstelle von Clear () zu verwenden, wie "Darin Dimitrov" hier vorgeschlagen hat stackoverflow.com/a/3931344/713246
Bibhu
4
@Bibhu: Wie hat er vorgeschlagen, dass RemoveAll () besser ist als Clear ()? Alles, was ich in seiner Antwort sah, war, dass RemoveAll () Clear () aufruft und funktional identisch zu sein scheint.
Adam Miller
1
Nur Session.Abandon()als "Abmelden" in einer internen App mit Windows-Authentifizierung verwendet - Benutzer mussten sich nicht erneut authentifizieren (Chrome, FF), aber die Sitzung wurde beendet und eine neue ausgegeben, die meinen Anforderungen entsprach
brichins
13

Nur die Verwendung von Session.Clear (), wenn sich ein Benutzer abmeldet, kann eine Sicherheitslücke darstellen. Da die Sitzung für den Webserver noch gültig ist. Es ist dann eine ziemlich triviale Angelegenheit, zu schnüffeln, die Sitzungs-ID zu ermitteln und diese Sitzung zu entführen.

Aus diesem Grund ist es beim Abmelden eines Benutzers sicherer und sinnvoller, Session.Abandon () zu verwenden, damit die Sitzung zerstört und eine neue Sitzung erstellt wird (obwohl die Abmeldeseite der Benutzeroberfläche Teil der neuen Sitzung wäre). Die neue Sitzung würde keine Benutzerdetails enthalten, und die Entführung der neuen Sitzung wäre gleichbedeutend mit einer neuen Sitzung, daher wäre sie stumm.

Schabbirh
quelle
4
Was wäre der Sinn, eine leere Sitzung zu entführen? Der Entführer müsste sich immer noch anmelden, und es gibt keine Daten, die dem neuen Benutzer versehentlich zur Verfügung gestellt werden könnten.
Trisped
3

Session.Abandonzerstört die Sitzung wie oben angegeben, daher sollten Sie diese verwenden, wenn Sie jemanden abmelden. Ich denke, eine gute Verwendung Session.Clearwäre für einen Einkaufskorb auf einer E-Commerce-Website. Auf diese Weise wird der Warenkorb gelöscht, ohne den Benutzer abzumelden.

Kasim Shafiq
quelle
Aber was ist, wenn ich Session.Abandonnur einen bestimmten Einkaufskorb lösche?
WTFZane
0

Ich hatte dieses Problem und versuchte beides, musste mich aber damit zufrieden geben, Mist wie "pageEditState" zu entfernen, aber keine Benutzerinformationen zu entfernen, damit ich ihn nicht noch einmal nachschlagen muss.

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