Trong ASP.NET, khi nào tôi nên sử dụng Session.Clear () thay vì Session.Abandon ()?


118

Cả Session.Clear () và Session.Abandon () đều loại bỏ các biến phiên. Theo tôi hiểu, Abandon () kết thúc phiên hiện tại và khiến một phiên mới được tạo, do đó gây ra các sự kiện Kết thúc và Bắt đầu.

Có vẻ thích gọi Abandon () hơn trong hầu hết các trường hợp, chẳng hạn như đăng xuất người dùng. Có trường hợp nào mà tôi muốn sử dụng Clear () thay thế không? Có nhiều sự khác biệt về hiệu suất không?

Câu trả lời:


172

Session.Abandon() hủy phiênsự kiện Session_OnEnd được kích hoạt.

Session.Clear()chỉ xóa tất cả các giá trị (nội dung) khỏi Đối tượng. Phiên có cùng khóa vẫn tồn tại.

Vì vậy, nếu bạn sử dụng Session.Abandon(), bạn sẽ mất phiên cụ thể đó và người dùng sẽ nhận được khóa phiên mới. Bạn có thể sử dụng nó chẳng hạn khi người dùng đăng xuất.

Sử dụng Session.Clear(), nếu bạn muốn người dùng ở lại trong cùng một phiên (ví dụ: nếu bạn không muốn người dùng đăng nhập lại) và đặt lại tất cả dữ liệu cụ thể của phiên.


1
Tôi tin rằng tốt hơn để sử dụng RemoveAll () thay vì Clear (), như "Darin Dimitrov" đã gợi ý trên đây stackoverflow.com/a/3931344/713246
Bibhu

4
@Bibhu: Làm thế nào anh ấy đề xuất rằng RemoveAll () tốt hơn Clear ()? Tất cả những gì tôi thấy trong câu trả lời của anh ấy là RemoveAll () gọi Clear () và có vẻ giống nhau về mặt chức năng.
Adam Miller

1
Chỉ cần sử dụng Session.Abandon()như một 'logout' trên một ứng dụng nội bộ sử dụng Windows Authentication - người dùng không cần phải tái xác thực (Chrome, FF), nhưng phiên xử và một cái mới ban hành, trong đó đáp ứng yêu cầu của tôi
brichins

13

Chỉ sử dụng Session.Clear () khi người dùng đăng xuất có thể tạo ra lỗ hổng bảo mật. Vì phiên vẫn hợp lệ đối với Máy chủ Web. Sau đó, việc đánh hơi và lấy Id phiên và chiếm quyền điều khiển phiên đó là một vấn đề khá nhỏ.

Vì lý do này, khi đăng xuất người dùng sẽ an toàn và hợp lý hơn khi sử dụng Session.Abandon () để phiên bị hủy và một phiên mới được tạo (mặc dù trang giao diện người dùng đăng xuất sẽ là một phần của phiên mới, phiên mới sẽ không có bất kỳ chi tiết nào của người dùng trong đó và việc chiếm quyền điều khiển phiên mới sẽ tương đương với việc có một phiên mới, do đó nó sẽ bị tắt tiếng).


4
Điều gì sẽ xảy ra khi chiếm quyền điều khiển một phiên trống? Kẻ tấn công sẽ vẫn phải đăng nhập và chúng không phải là dữ liệu để vô tình cung cấp cho người dùng mới.
Đã thử nghiệm vào

3

Session.Abandonhủy phiên như đã nêu ở trên, vì vậy bạn nên sử dụng điều này khi đăng xuất ai đó. Tôi nghĩ rằng việc sử dụng tốt Session.Clearsẽ là cho một giỏ hàng trên một trang web thương mại điện tử. Bằng cách đó, giỏ hàng được xóa mà không cần đăng xuất người dùng.


Nhưng nếu tôi sử dụng Session.Abandonđể xóa một giỏ hàng cụ thể thì sao?
WTFZane

0

Tôi đã gặp sự cố này và đã thử cả hai, nhưng phải giải quyết việc xóa những thứ tào lao như "pageEditState", nhưng không xóa thông tin người dùng vì tôi sẽ phải tra cứu lại.

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
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.