Di ASP.NET, kapan saya harus menggunakan Session.Clear () daripada Session.Abandon ()?

118

Baik Session.Clear () dan Session.Abandon () menghapus variabel sesi. Seperti yang saya pahami, Abandon () mengakhiri sesi saat ini, dan menyebabkan sesi baru dibuat sehingga menyebabkan peristiwa Akhiri dan Mulai diaktifkan.

Tampaknya lebih baik memanggil Abandon () dalam banyak kasus, seperti mengeluarkan pengguna. Apakah ada skenario di mana saya akan menggunakan Clear () sebagai gantinya? Apakah ada banyak perbedaan kinerja?

Lance Fisher
sumber

Jawaban:

172

Session.Abandon() menghancurkan sesi dan acara Session_OnEnd dipicu.

Session.Clear()hanya menghapus semua nilai (konten) dari Objek. Sesi dengan kunci yang sama masih hidup.

Jadi, jika Anda menggunakan Session.Abandon(), Anda kehilangan sesi khusus itu dan pengguna akan mendapatkan kunci sesi baru. Anda bisa menggunakannya misalnya saat pengguna logout.

Gunakan Session.Clear(), jika Anda ingin pengguna tetap berada di sesi yang sama (jika Anda tidak ingin pengguna masuk kembali misalnya) dan menyetel ulang semua data khusus sesi.

percikan
sumber
1
Saya percaya lebih baik menggunakan RemoveAll () daripada Clear (), seperti yang disarankan "Darin Dimitrov" di sini stackoverflow.com/a/3931344/713246
Bibhu
4
@Bibhu: Bagaimana dia menyarankan bahwa RemoveAll () lebih baik daripada Clear ()? Yang saya lihat dalam jawabannya adalah bahwa RemoveAll () memanggil Clear (), dan tampaknya secara fungsional identik.
Adam Miller
1
Baru saja digunakan Session.Abandon()sebagai 'logout' pada aplikasi internal menggunakan Autentikasi Windows - pengguna tidak perlu mengautentikasi ulang (Chrome, FF), tetapi sesi tersebut dibuang dan sesi baru dikeluarkan, yang memenuhi persyaratan saya
brichins
13

Hanya menggunakan Session.Clear () saat pengguna logout dapat menimbulkan celah keamanan. Karena sesi tersebut masih berlaku sejauh menyangkut Server Web. Hal ini kemudian menjadi masalah yang cukup sepele untuk mengendus, dan mengambil ID sesi, dan membajak sesi itu.

Untuk alasan ini, saat mengeluarkan pengguna, akan lebih aman dan lebih masuk akal untuk menggunakan Session.Abandon () sehingga sesi dimusnahkan, dan sesi baru dibuat (meskipun halaman UI logout akan menjadi bagian dari sesi baru, sesi baru tidak akan memiliki detail pengguna di dalamnya dan membajak sesi baru sama dengan memiliki sesi baru, oleh karena itu sesi tersebut akan dibisukan).

shabbirh
sumber
4
Apa gunanya membajak sesi kosong? Pembajak masih harus masuk, dan tidak ada datanya yang tidak sengaja diberikan kepada pengguna baru.
Dicabut
3

Session.Abandonmenghancurkan sesi seperti yang disebutkan di atas sehingga Anda harus menggunakan ini saat mengeluarkan seseorang. Menurut saya kegunaan yang baik Session.Clearadalah untuk keranjang belanja di situs web e-niaga. Dengan cara itu keranjang dibersihkan tanpa mengeluarkan pengguna.

Kasim Shafiq
sumber
Tapi bagaimana jika saya biasa Session.Abandonmembersihkan keranjang belanja tertentu?
WTFZane
0

Saya mengalami masalah ini dan mencoba keduanya, tetapi harus puas menghapus omong kosong seperti "pageEditState", tetapi tidak menghapus info pengguna agar saya tidak perlu mencarinya lagi.

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