Подтвердить что ты не робот

SessionID по-прежнему остается неизменным после вызова Session.Abandon

Я пишу код регистрации, основанный на SessionID...

Однако, когда я выхожу из системы (вызывая Session.Abandon) и снова входите в систему, SessionID все тот же. По сути, у каждого браузера на моем ПК есть собственный идентификатор сеанса "прикрепленный", и по какой-то причине он не изменится:/

Любые идеи, что происходит?

Конфигурация моей сессии выглядит следующим образом:

    <sessionState
       mode="InProc"
       timeout="1" />

Спасибо, Paweł

4b9b3361

Ответ 1

Проверьте эту статью, которая объясняет процесс на session.abandon

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

Взято из ссылки выше -

"Когда вы отказываетесь от сеанса, cookie идентификатора сеанса не удаляется из браузера пользователя. Поэтому, как только сеанс будет удален, любые новые запросы к одному и тому же приложению будут использовать один и тот же идентификатор сеанса, но будут иметь новый экземпляр состояния сеанса"

Ответ 2

Это поведение по умолчанию по дизайну, как указано здесь:

Идентификаторы сеансов для заброшенных или истекших сеансов по умолчанию перерабатываются. То есть, если выполняется запрос, который включает идентификатор сеанса для истекшего или оставленного сеанса, новый сеанс запускается с использованием того же идентификатора сеанса. Вы можете отключить это, установив для атрибута restoreateExpiredSessionId элемента конфигурации sessionState значение true

Вы можете отключить этот параметр, как указано выше.

EDIT: настройка атрибута relayateExpiredSessionId на true работает только для сеансов cookieless. Чтобы преодолеть вашу проблему, вы можете рассмотреть возможность реализации пользовательского класса, который наследует класс SessionIDManager. Вы можете получить информацию об этом здесь и здесь.

Ответ 3

Здесь то, что сработало для меня, единственное предостережение в том, что этот код нужно отделить от вашей логина.

Response.Cookies("ASP.NET_SessionId").Expires = DateTime.Now.AddYears(-30)

Он не вступит в силу, пока страница не закончит загрузку. В моем приложении у меня есть простая процедура безопасности, которая заставляет новый идентификатор, например:

if session("UserID") = "" then 
    Response.Cookies("ASP.NET_SessionId").Expires = DateTime.Now.AddYears(-30)
    Response.Redirect("login.aspx")
end if

Ответ 4

Вы можете явно очистить файл cookie сеанса. Вы должны контролировать имя файла cookie configuration и использовать одно и то же имя при очистке.

Изменить: Очистка сеансового файла cookie при отмене сеанса заставит ASP.NET создать новый сеанс и sessionid для следующего запроса. BTW, еще один способ очистить сессионный файл cookie - использовать SessionIDManager.RemoveSessionID.

Ответ 5

Это старый пост, но если кто-то все еще ищет ответы, вот полное и пошаговое решение о том, как каждый раз получать чистый выход с новым идентификатором сеанса.

Обратите внимание, что эта статья относится только к сайтам с поддержкой cookie (cookieless = false).

Шаг (1) Измените файл web.config и добавьте флаг "restoreateExpiredSessionID" под

<sessionState mode="InProc" cookieless="false" regenerateExpiredSessionId="true" />

Шаг (2) Добавьте следующий код в свое событие выхода из системы -

Session.Clear(); 
Session.Abandon();
Response.Cookies.Add(New HttpCookie("ASP.NET_SessionId", ""));
Response.redirect(to you login page);

Шаг (3) Добавьте следующий код в свое имя страницы входа page_load -

if(!IsPostBack) 
{
    Session.Clear(); 
    Session.Abandon();
}

Шаг 2 и 3 служат одной ВАЖНОЙ цели. Этот код позволяет создать новый идентификатор сеанса после нажатия кнопки "Вход". Это предотвращает слабое управление сеансом (уязвимость сеансовой фиксации), которая, скорее всего, будет обнаружена во время пробной проверки вашего сайта третьей стороной.

Надеюсь, что это поможет.