ใน ASP.NET ฉันควรใช้ Session.Clear () แทน Session.Abandon () เมื่อใด


118

ทั้ง Session.Clear () และ Session.Abandon () กำจัดตัวแปรเซสชัน ตามที่ฉันเข้าใจ Abandon () จะสิ้นสุดเซสชันปัจจุบันและทำให้เซสชันใหม่ถูกสร้างขึ้นซึ่งทำให้เหตุการณ์สิ้นสุดและเริ่มทำงาน

ดูเหมือนว่าควรเรียก Abandon () เป็นส่วนใหญ่เช่นการล็อกผู้ใช้ออก มีสถานการณ์ที่ฉันใช้ Clear () แทนหรือไม่? ประสิทธิภาพแตกต่างกันมากไหม

คำตอบ:


172

Session.Abandon() ทำลายเซสชันและเหตุการณ์ Session_OnEndจะถูกทริกเกอร์

Session.Clear()เพียงแค่ลบค่าทั้งหมด (เนื้อหา) ออกจาก Object เซสชันที่มีคีย์เดียวกันยังคงมีชีวิตอยู่

ดังนั้นหากคุณใช้Session.Abandon()คุณจะสูญเสียเซสชันนั้นและผู้ใช้จะได้รับรหัสเซสชันใหม่ คุณสามารถใช้ตัวอย่างเช่นเมื่อผู้ใช้ออกจากระบบ

ใช้Session.Clear()ถ้าคุณต้องการให้ผู้ใช้ยังคงอยู่ในเซสชันเดียวกัน (เช่นหากคุณไม่ต้องการให้ผู้ใช้เข้าสู่ระบบอีกครั้ง) และรีเซ็ตข้อมูลเฉพาะเซสชันทั้งหมด


1
ฉันเชื่อว่าดีกว่าที่จะใช้ RemoveAll () แทน Clear () ตามที่ "Darin Dimitrov" ได้แนะนำไว้ที่นี่stackoverflow.com/a/3931344/713246
Bibhu

4
@Bibhu: เขาแนะนำว่า RemoveAll () ดีกว่า Clear () อย่างไร? สิ่งที่ฉันเห็นในคำตอบของเขาคือ RemoveAll () เรียก Clear () และดูเหมือนว่าจะทำงานเหมือนกัน
Adam Miller

1
เพิ่งใช้Session.Abandon()เป็น 'ออกจากระบบ' ในแอปภายในโดยใช้ Windows Authentication - ผู้ใช้ไม่จำเป็นต้องตรวจสอบสิทธิ์ซ้ำ (Chrome, FF) แต่เซสชันถูกกำจัดและมีการออกเซสชันใหม่ซึ่งตรงตามข้อกำหนดของฉัน
brichins

13

ใช้เฉพาะ Session.Clear () เมื่อผู้ใช้ออกจากระบบอาจก่อให้เกิดช่องโหว่ด้านความปลอดภัย เนื่องจากเซสชันยังคงใช้ได้ตราบเท่าที่เกี่ยวข้องกับเว็บเซิร์ฟเวอร์ จากนั้นจึงเป็นเรื่องเล็กน้อยที่จะสูดดมและคว้ารหัสเซสชันและจี้เซสชันนั้น

ด้วยเหตุนี้เมื่อนำผู้ใช้ออกจากระบบจึงจะปลอดภัยและเหมาะสมกว่าในการใช้ Session.Abandon () เพื่อให้เซสชันถูกทำลายและสร้างเซสชันใหม่ (แม้ว่าหน้า UI การออกจากระบบจะเป็นส่วนหนึ่งของเซสชันใหม่ก็ตาม เซสชันใหม่จะไม่มีรายละเอียดผู้ใช้ใด ๆ อยู่ในนั้นและการไฮแจ็คเซสชันใหม่จะเทียบเท่ากับการมีเซสชันใหม่ดังนั้นจึงจะปิดเสียง)


4
อะไรคือประเด็นของการหักหลังเซสชันที่ว่างเปล่า? นักจี้จะยังคงต้องเข้าสู่ระบบและไม่มีข้อมูลที่จะให้แก่ผู้ใช้ใหม่โดยไม่ได้ตั้งใจ
Trisped

3

Session.Abandonทำลายเซสชันตามที่ระบุไว้ข้างต้นดังนั้นคุณควรใช้สิ่งนี้เมื่อนำบุคคลอื่นออกจากระบบ ฉันคิดว่าการใช้ประโยชน์ที่ดีSession.Clearคือตะกร้าสินค้าบนเว็บไซต์อีคอมเมิร์ซ ด้วยวิธีนี้ตะกร้าจะถูกล้างโดยไม่ต้องออกจากระบบผู้ใช้


แต่จะเกิดอะไรขึ้นถ้าฉันใช้Session.Abandonเพียงแค่ล้างตะกร้าสินค้าเฉพาะ?
WTFZane

0

ฉันมีปัญหานี้และลองทั้งสองอย่างแล้ว แต่ต้องจัดการกับการลบอึเช่น "pageEditState" แต่ไม่ได้ลบข้อมูลผู้ใช้เพื่อไม่ให้ฉันต้องค้นหาอีกครั้ง

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.