Когда в ASP.NET следует использовать Session.Clear (), а не Session.Abandon ()?

118

И Session.Clear (), и Session.Abandon () избавляются от переменных сеанса. Насколько я понимаю, Abandon () завершает текущий сеанс и вызывает создание нового сеанса, что приводит к срабатыванию событий End и Start.

В большинстве случаев кажется предпочтительным вызывать Abandon (), например, при выходе пользователя из системы. Существуют ли сценарии, в которых я бы использовал вместо этого Clear ()? Есть большая разница в производительности?

Лэнс Фишер
источник

Ответы:

172

Session.Abandon() разрушает сеанс, и запускается событие Session_OnEnd.

Session.Clear()просто удаляет все значения (содержимое) из объекта. Сеанс с тем же ключом все еще жив.

Итак, если вы используете Session.Abandon(), вы потеряете этот конкретный сеанс, и пользователь получит новый ключ сеанса. Вы можете использовать его, например, когда пользователь выходит из системы.

Используйте Session.Clear(), если вы хотите, чтобы пользователь оставался в том же сеансе (например, если вы не хотите, чтобы пользователь повторно входил в систему), и сбросьте все данные, относящиеся к сеансу.

splattne
источник
1
Я считаю, что лучше использовать RemoveAll () вместо Clear (), как предложил «Дарин Димитров» здесь stackoverflow.com/a/3931344/713246
Bibhu
4
@Bibhu: Как он предположил, что RemoveAll () лучше, чем Clear ()? Все, что я увидел в его ответе, это то, что RemoveAll () вызывает Clear () и кажется функционально идентичным.
Адам Миллер
1
Просто используется Session.Abandon()как «выход из системы» во внутреннем приложении с использованием проверки подлинности Windows - пользователям не нужно было повторно проходить проверку подлинности (Chrome, FF), но сеанс был
удален и запущен
13

Только использование Session.Clear () при выходе пользователя из системы может создать брешь в безопасности. Поскольку сеанс все еще действителен для веб-сервера. Тогда достаточно тривиально обнюхать, получить идентификатор сеанса и захватить этот сеанс.

По этой причине при выходе пользователя из системы было бы безопаснее и разумнее использовать Session.Abandon (), чтобы сеанс был уничтожен и создан новый сеанс (даже если страница пользовательского интерфейса выхода из системы будет частью нового сеанса, в новом сеансе не будет никаких сведений о пользователях, и захват нового сеанса будет эквивалентен наличию нового сеанса, поэтому он будет отключен).

shabbirh
источник
4
Какой смысл захватывать пустую сессию? Угонщику все равно придется войти в систему, и у них нет данных, которые можно было бы случайно предоставить новому пользователю.
Trisped 09
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);
    }
}
MatthewMartin
источник