Cách xóa cookie trên trang web ASP.NET


87

Trong trang web của tôi khi người dùng nhấp vào nút "Đăng xuất", trang Logout.aspx sẽ tải bằng mã Session.Clear().

Trong ASP.NET/C#, điều này có xóa tất cả cookie không? Hoặc có mã nào khác cần được thêm vào để xóa tất cả cookie trên trang web của tôi không?

Câu trả lời:


149

Hãy thử một cái gì đó như vậy:

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

Nhưng nó cũng có ý nghĩa khi sử dụng

Session.Abandon();

bên cạnh đó trong nhiều kịch bản.


15
Session.Abandonsẽ xóa cookie phiên ASP.NET, nhưng không xóa cookie bạn đặt theo cách thủ công, như userID ở đây. Và Cookies["whatever"]không bao giờ rỗng; khung sẽ tạo một cookie nếu bạn yêu cầu một cookie không tồn tại.
Andomar

11
@Andomar, thực sự Cookies["whatever"]trả về null khi cookie không tồn tại! Tôi biết đây là một nhận xét cũ nhưng tôi không muốn các độc giả khác bị hiểu lầm bởi nhận xét này.
Nuno Agapito

6
Điều rất quan trọng Expireslà KHÔNG được đặt thành DateTime.MinValuevì điều này thực sự sẽ khiến cookie hết hạn Phiên, có nghĩa là nó đợi cho đến khi trình duyệt / tab (phụ thuộc vào trình duyệt) bị đóng trước khi xóa cookie.
Nashenas

7
@NunoAgapito Rất cũ nhưng đối với những người dùng khác, Cookie ["bất cứ điều gì"] trả về giá trị rỗng nếu bạn đọc từ "Yêu cầu" và trả về cookie trống nếu bạn đọc từ "Phản hồi".
Athiwat Chunlakhan

nhưng điều này chỉ xóa nội dung khỏi cookie, ít nhất là cookie vẫn còn trong trình duyệt đối với tôi
Đang ở

50

Không, Cookie chỉ có thể được làm sạch bằng cách đặt Ngày hết hạn cho mỗi cookie .

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

Tại thời điểm Session.Clear():

  • Tất cả các cặp khóa-giá trị khỏi Sessionbộ sưu tập đều bị xóa. Session_Endsự kiện không xảy ra.

Nếu bạn sử dụng phương pháp này trong khi đăng xuất, bạn cũng nên sử dụng Session.Abandonphương pháp để Session_Endsự kiện:

  • Cookie có ID phiên (nếu ứng dụng của bạn sử dụng cookie cho kho lưu trữ id phiên, theo mặc định) sẽ bị xóa

Đúng về hạn sử dụng, nhưng tôi tin rằng ifdòng thực sự không hoạt động. Khi bạn yêu cầu một cookie với Cookies["whatever"]khuôn khổ sẽ tạo ra một cookie nếu nó không tồn tại.
Andomar,

@Andomar Mã này tôi nhận được từ MSDN. Tôi không nghĩ rằng nó sẽ tạo ra một cookie nếu chúng ta gọi Requestđối tượng.
VMAtm

2
Aha, có vẻ như nó chỉ tạo một cookie cho Responseđối tượng. Thú vị :)
Andomar

3
Mã này có thể được tối ưu hóa chỉ trong một dòng Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1). Tại đây máy chủ sẽ yêu cầu trình duyệt xóa cookie. Trình duyệt sẽ xóa nó nếu nó tồn tại.
shashwat

2
Vâng đối với tôi, tôi cần phần Response.Cookies.Add (myCookie) - không có nó, nó không hoạt động luôn / chính xác. Cảm ơn.
Christopher D. Emerson

28

Đây là những gì tôi sử dụng:

    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();
        }
    }

Cám ơn rất nhiều! Cũng đã thoát khỏi vấn đề của tôi rằng cookie sẽ không cập nhật phía máy chủ
Tom el Safadi

11

Thật không may, đối với tôi, cài đặt "Expires" không phải lúc nào cũng hoạt động. Cookie không bị ảnh hưởng.

Mã này đã làm việc cho tôi:

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

nơi "ASP.NET_SessionId"là tên của cookie. Điều này không thực sự xóa cookie, nhưng ghi đè nó bằng một cookie trống, đủ gần đối với tôi.


5

Tôi chỉ muốn chỉ ra rằng cookie Session ID không bị xóa khi sử dụng Session.Abandon như những người khác đã nói.

Khi bạn bỏ qua một phiên, cookie của ID phiên sẽ không bị xóa khỏi trình duyệt của người dùng. Do đó, ngay sau khi phiên bị hủy bỏ, bất kỳ yêu cầu mới nào đối với cùng một ứng dụng sẽ sử dụng cùng một ID phiên nhưng sẽ có một phiên bản trạng thái phiên mới. Đồng thời, nếu người dùng mở một ứng dụng khác trong cùng một miền DNS, người dùng sẽ không bị mất trạng thái phiên của họ sau khi phương thức Bỏ qua được gọi từ một ứng dụng.

Đôi khi, bạn có thể không muốn sử dụng lại ID phiên. Nếu bạn làm như vậy và nếu bạn hiểu các phân nhánh của việc không sử dụng lại ID phiên, hãy sử dụng ví dụ mã sau để bỏ một phiên và để xóa cookie ID phiên:

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

Ví dụ mã này xóa trạng thái phiên khỏi máy chủ và đặt cookie trạng thái phiên thành null. Giá trị null sẽ xóa cookie khỏi trình duyệt một cách hiệu quả.

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


5

Bây giờ là năm 2018, vì vậy trong ASP.NET Core, có một chức năng được tích hợp sẵn. Để xóa cookie, hãy thử mã này:

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

4

Bạn không bao giờ nên lưu trữ mật khẩu dưới dạng cookie. Để xóa một cookie, bạn thực sự chỉ cần sửa đổi và hết hạn sử dụng. Bạn thực sự không thể xóa nó, tức là xóa nó khỏi đĩa của người dùng.

Đây là một mẫu:

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

Lấy tiêu đề Câu hỏi của OP là xóa tất cả cookie - "Xóa Cookie trong trang web"

Tôi đã tìm thấy mã của Dave Domagala trên web ở đâu đó. Tôi đã chỉnh sửa Dave's để cho phép cả cookie của Google Analytics - cái này lặp lại qua tất cả cookie được tìm thấy trên trang web và xóa tất cả. (Từ góc độ nhà phát triển - cập nhật mã mới vào một trang hiện có, là một động thái tốt để tránh các vấn đề khi người dùng truy cập lại trang web).

Tôi sử dụng mã bên dưới song song với việc đọc cookie trước, giữ bất kỳ dữ liệu cần thiết nào - sau đó đặt lại cookie sau khi rửa sạch mọi thứ bằng vòng lặp bên dưới.

Mật mã:

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.
}

Bổ sung: Nếu bạn sử dụng Google Analytics

Vòng lặp / xóa ở trên sẽ xóa TẤT CẢ cookie cho trang web, vì vậy nếu bạn sử dụng Google Analytics - có thể sẽ hữu ích khi giữ cookie __utmz vì cookie này theo dõi khách truy cập đến từ đâu, công cụ tìm kiếm nào đã được sử dụng, cái gì liên kết được nhấp vào, từ khóa nào đã được sử dụng và chúng ở đâu trên thế giới khi trang web của bạn được truy cập.

Vì vậy, để giữ nó, hãy viết một câu lệnh if đơn giản khi tên cookie được biết:

... 
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

Mặc dù đây là một chủ đề cũ, tôi nghĩ nếu ai đó vẫn đang tìm kiếm giải pháp trong tương lai.

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

Đó là những gì đã lừa tôi.



0

Bạn phải đặt ngày hết hạn để xóa cookie

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

Điều này sẽ không tạo ra một ngoại lệ nếu cookie không tồn tại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.