วิธีลบคุกกี้บนเว็บไซต์ ASP.NET


87

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

ใน ASP.NET/C# สิ่งนี้ล้างคุกกี้ทั้งหมดหรือไม่ หรือมีรหัสอื่นที่ต้องเพิ่มเพื่อลบคุกกี้ทั้งหมดในเว็บไซต์ของฉันหรือไม่?

คำตอบ:


150

ลองอะไรแบบนั้น:

if (Request.Cookies["userId"] != null)
{
    Response.Cookies["userId"].Expires = DateTime.Now.AddDays(-1);   
}

แต่ก็ยังสมเหตุสมผลที่จะใช้

Session.Abandon();

นอกจากนี้ในหลาย ๆ สถานการณ์


15
Session.Abandonจะล้างคุกกี้เซสชัน ASP.NET แต่ไม่ใช่คุกกี้ที่คุณตั้งค่าด้วยตนเองเช่น userID ที่นี่ และCookies["whatever"]ไม่เคยเป็นโมฆะ เฟรมเวิร์กจะสร้างคุกกี้หากคุณขอคุกกี้ที่ไม่มีอยู่จริง
Andomar

11
@Andomar Cookies["whatever"]คืนค่าว่างเมื่อคุกกี้ไม่มีอยู่จริง! ฉันรู้ว่านี่เป็นความคิดเห็นเก่า แต่ฉันไม่ต้องการให้ผู้อ่านคนอื่นเข้าใจผิดจากความคิดเห็นนี้
Nuno Agapito

6
นอกจากนี้ยังสำคัญมากที่Expiresไม่ได้ตั้งค่าDateTime.MinValueเป็นเพราะจะทำให้คุกกี้หมดอายุเซสชันซึ่งหมายความว่าจะรอจนกว่าเบราว์เซอร์ / แท็บ (ขึ้นอยู่กับเบราว์เซอร์) ก่อนที่จะลบคุกกี้
Nashenas

7
@NunoAgapito เก่ามาก แต่สำหรับผู้ใช้รายอื่นคุกกี้ ["อะไรก็ได้"] จะคืนค่าว่างหากคุณอ่านจาก "คำขอ" และส่งคืนคุกกี้ที่ว่างเปล่าหากคุณอ่านจาก "การตอบกลับ"
อธิวัฒน์ชุนละขันธ์

แต่นี่เป็นการลบเนื้อหาออกจากคุกกี้เท่านั้นคุกกี้ยังคงอยู่ในเบราว์เซอร์อย่างน้อยสำหรับฉัน
Beingnin

50

ไม่สามารถทำความสะอาดคุกกี้ได้โดยการตั้งค่าวันหมดอายุสำหรับแต่ละคุกกี้เท่านั้น

if (Request.Cookies["UserSettings"] != null)
{
    HttpCookie myCookie = new HttpCookie("UserSettings");
    myCookie.Expires = DateTime.Now.AddDays(-1d);
    Response.Cookies.Add(myCookie);
}

ในช่วงเวลาของSession.Clear():

  • คู่คีย์ - ค่าทั้งหมดจากSessionคอลเล็กชันจะถูกลบออก Session_Endเหตุการณ์ไม่เกิดขึ้น

หากคุณใช้วิธีนี้ในระหว่างการออกจากระบบคุณควรใช้Session.Abandonวิธีนี้เพื่อ Session_Endเหตุการณ์:

  • คุกกี้ที่มีรหัสเซสชัน (หากแอปพลิเคชันของคุณใช้คุกกี้สำหรับที่เก็บรหัสเซสชันซึ่งเป็นค่าเริ่มต้น) จะถูกลบ

เกี่ยวกับวันหมดอายุ แต่ฉันเชื่อว่าifบรรทัดนั้นใช้ไม่ได้จริง เมื่อคุณขอคุกกี้กับCookies["whatever"]เฟรมเวิร์กจะสร้างคุกกี้หากไม่มีอยู่
Andomar

@Andomar รหัสนี้ได้มาจาก MSDN ฉันไม่คิดว่ามันจะสร้างคุกกี้ถ้าเราเรียกRequestวัตถุ
VMAtm

2
ดูเหมือนว่ามันจะสร้างคุกกี้สำหรับResponseวัตถุเท่านั้น น่าสนใจ :)
Andomar

3
โค้ดนี้สามารถปรับให้เหมาะสมได้ในบรรทัดResponse.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1)เดียว ที่นี่เซิร์ฟเวอร์จะขอให้เบราว์เซอร์ลบคุกกี้ เบราว์เซอร์จะลบออกหากมีอยู่
shashwat

2
ใช่สำหรับฉันฉันต้องการส่วน Response.Cookies.Add (myCookie) - โดยที่มันไม่ได้ผลเสมอไป / ถูกต้อง ขอบคุณ.
Christopher

28

นี่คือสิ่งที่ฉันใช้:

    private void ExpireAllCookies()
    {
        if (HttpContext.Current != null)
        {
            int cookieCount = HttpContext.Current.Request.Cookies.Count;
            for (var i = 0; i < cookieCount; i++)
            {
                var cookie = HttpContext.Current.Request.Cookies[i];
                if (cookie != null)
                {
                    var expiredCookie = new HttpCookie(cookie.Name) {
                        Expires = DateTime.Now.AddDays(-1),
                        Domain = cookie.Domain
                    };
                    HttpContext.Current.Response.Cookies.Add(expiredCookie); // overwrite it
                }
            }

            // clear cookies server side
            HttpContext.Current.Request.Cookies.Clear();
        }
    }

ขอบคุณมาก! ยังกำจัดปัญหาของฉันที่คุกกี้จะไม่อัปเดตฝั่งเซิร์ฟเวอร์
Tom el Safadi

11

น่าเสียดายสำหรับฉันการตั้งค่า "หมดอายุ" ไม่ได้ผลเสมอไป คุกกี้ไม่ได้รับผลกระทบ

รหัสนี้ใช้ได้ผลสำหรับฉัน:

HttpContext.Current.Session.Abandon();
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

ที่"ASP.NET_SessionId"เป็นชื่อของคุกกี้ สิ่งนี้ไม่ได้ลบคุกกี้จริงๆ แต่แทนที่ด้วยคุกกี้เปล่าซึ่งอยู่ใกล้พอสำหรับฉัน


5

ฉันแค่ต้องการชี้ให้เห็นว่าคุกกี้ Session ID ไม่ได้ถูกลบออกเมื่อใช้ Session.Abandon ตามที่คนอื่นพูด

เมื่อคุณละทิ้งเซสชันคุกกี้ ID เซสชันจะไม่ถูกลบออกจากเบราว์เซอร์ของผู้ใช้ ดังนั้นทันทีที่เซสชันถูกละทิ้งคำขอใหม่ ๆ ไปยังแอปพลิเคชันเดียวกันจะใช้รหัสเซสชันเดียวกัน แต่จะมีอินสแตนซ์สถานะเซสชันใหม่ ในขณะเดียวกันหากผู้ใช้เปิดแอปพลิเคชันอื่นภายในโดเมน DNS เดียวกันผู้ใช้จะไม่สูญเสียสถานะเซสชันของตนหลังจากที่มีการเรียกเมธอด Abandon จากแอปพลิเคชันหนึ่ง

บางครั้งคุณอาจไม่ต้องการใช้รหัสเซสชันซ้ำ หากคุณทำและหากคุณเข้าใจการแบ่งส่วนของการไม่ใช้รหัสเซสชันซ้ำให้ใช้ตัวอย่างโค้ดต่อไปนี้เพื่อละทิ้งเซสชันและเพื่อล้างคุกกี้รหัสเซสชัน:

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

ตัวอย่างโค้ดนี้จะล้างสถานะเซสชันจากเซิร์ฟเวอร์และตั้งค่าคุกกี้สถานะเซสชันเป็น null ค่า null จะล้างคุกกี้ออกจากเบราว์เซอร์ได้อย่างมีประสิทธิภาพ

http://support.microsoft.com/kb/899918


5

ตอนนี้เป็นปี 2018 ดังนั้นใน ASP.NET Core จึงมีฟังก์ชันในตัวแบบตรงไปตรงมา หากต้องการลบคุกกี้ให้ลองใช้รหัสนี้:

if(Request.Cookies["aa"] != null)
{
    Response.Cookies.Delete("aa");
}
return View();

4

คุณไม่ควรเก็บรหัสผ่านเป็นคุกกี้ ในการลบคุกกี้คุณเพียงแค่ต้องแก้ไขและทำให้มันหมดอายุ คุณไม่สามารถลบได้จริง ๆ กล่าวคือลบออกจากดิสก์ของผู้ใช้

นี่คือตัวอย่าง:

HttpCookie aCookie;
    string cookieName;
    int limit = Request.Cookies.Count;
    for (int i=0; i<limit; i++)
    {
        cookieName = Request.Cookies[i].Name;
        aCookie = new HttpCookie(cookieName);
        aCookie.Expires = DateTime.Now.AddDays(-1); // make it expire yesterday
        Response.Cookies.Add(aCookie); // overwrite it
    }

2

การตั้งชื่อคำถามของ OP เป็นการลบคุกกี้ทั้งหมด - "Delete Cookies in website"

ฉันเจอรหัสจาก Dave Domagala บนเว็บที่ไหนสักแห่ง ฉันแก้ไข Dave เพื่ออนุญาตให้ใช้คุกกี้ Google Analytics ด้วย - ซึ่งวนลูปผ่านคุกกี้ทั้งหมดที่พบในเว็บไซต์และลบออกทั้งหมด (จากมุมมองของนักพัฒนาซอฟต์แวร์ - การอัปเดตโค้ดใหม่ลงในไซต์ที่มีอยู่ถือเป็นสิ่งที่ดีในการหลีกเลี่ยงปัญหาที่ผู้ใช้กลับมาเยี่ยมชมไซต์อีกครั้ง)

ฉันใช้รหัสด้านล่างควบคู่กับการอ่านคุกกี้ก่อนโดยเก็บข้อมูลที่จำเป็นใด ๆ จากนั้นรีเซ็ตคุกกี้หลังจากล้างทุกอย่างให้สะอาดด้วยลูปด้านล่าง

รหัส:

int limit = Request.Cookies.Count; //Get the number of cookies and 
                                   //use that as the limit.
HttpCookie aCookie;   //Instantiate a cookie placeholder
string cookieName;   

//Loop through the cookies
for(int i = 0; i < limit; i++)
{
 cookieName = Request.Cookies[i].Name;    //get the name of the current cookie
 aCookie = new HttpCookie(cookieName);    //create a new cookie with the same
                                          // name as the one you're deleting
 aCookie.Value = "";    //set a blank value to the cookie 
 aCookie.Expires = DateTime.Now.AddDays(-1);    //Setting the expiration date
                                                //in the past deletes the cookie

 Response.Cookies.Add(aCookie);    //Set the cookie to delete it.
}

เพิ่มเติม: หากคุณใช้ Google Analytics

การวนรอบ / ลบข้างต้นจะลบคุกกี้ทั้งหมดสำหรับไซต์ดังนั้นหากคุณใช้ Google Analytics - อาจเป็นประโยชน์ที่จะยึดคุกกี้ __utmz ไว้เนื่องจากคุกกี้นี้จะติดตามว่าผู้เยี่ยมชมมาจากไหนใช้เครื่องมือค้นหาอะไร ลิงค์ถูกคลิกใช้คีย์เวิร์ดอะไรและอยู่ที่ไหนในโลกเมื่อมีการเข้าถึงเว็บไซต์ของคุณ

ดังนั้นเพื่อเก็บไว้ให้ห่อคำสั่ง if ง่ายๆเมื่อทราบชื่อคุกกี้:

... 
aCookie = new HttpCookie(cookieName);    
if (aCookie.Name != "__utmz")
{
    aCookie.Value = "";    //set a blank value to the cookie 
    aCookie.Expires = DateTime.Now.AddDays(-1);   

    HttpContext.Current.Response.Cookies.Add(aCookie);    
}

1

แม้ว่านี่จะเป็นกระทู้เก่า แต่ฉันคิดว่ามีใครยังคงค้นหาวิธีแก้ปัญหาในอนาคต

HttpCookie mycookie = new HttpCookie("aa");
mycookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(mycookie1);

นั่นคือเคล็ดลับสำหรับฉัน



0

คุณต้องกำหนดวันหมดอายุเพื่อลบคุกกี้

Request.Cookies[yourCookie]?.Expires.Equals(DateTime.Now.AddYears(-1));

สิ่งนี้จะไม่ทำให้เกิดข้อยกเว้นหากไม่มีคุกกี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.