Остановить повторное использование идентификатора сеанса сайтом по истечении срока действия

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

cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

для установки нового идентификатора сеанса при выходе из системы, но когда сеанс истекает, идентификатор сеанса используется повторно, если экземпляр браузера не закрыт. В моем web.config я использовал

        <sessionState mode="InProc" timeout="1" cookieName="session" regenerateExpiredSessionId="true" />

но по-прежнему получайте повторное использование сеансов.

Я не могу убить файл cookie в Session_end (), потому что у меня нет доступа, потому что нет HttpContext или запроса, поэтому я не могу его сбросить таким образом.

Есть ли у кого-нибудь идеи, как я могу заставить новый sessionId из файла Global.asax.cs?

Спасибо

Дэйв

Изменить - это в настоящее время в нашей среде разработки, но наше производственное приложение использует сервер состояний для сеанса. Не уверен, должно ли это повлиять на распределение sessionId (я знаю, что мне нужно будет использовать собственный IHttpModule, а не Session_end)


person Dave    schedule 30.09.2010    source источник


Ответы (2)


Согласно документации по свойству RegenerateExpiredSessionId:

По умолчанию при включении RegenerateExpiredSessionId повторно выдаются только URL-адреса без файлов cookie.

Итак, если вы не используете сеансы без файлов cookie, вам не повезло

Что вы делаете с этими идентификаторами сеансов, если вам нужны новые? Хранить их в базе данных или где-то еще для последующего поиска? Если это так, возможно, вам стоит использовать какой-либо другой идентификатор, которым вы можете управлять (например, столбец идентификаторов на сервере sql).

Кстати - вы действительно хотите, чтобы ваша сессия закончилась через одну минуту, или это просто тест?

person Ray    schedule 30.09.2010
comment
Ах, не видел не о сессиях без файлов cookie. - person Dave; 30.09.2010
comment
Я хочу сгенерировать новый идентификатор, чтобы я мог сопоставить вход в систему с истечением срока действия / выходом из системы для функции контрольного журнала, чтобы мы могли получить точное представление о том, как долго пользователи находятся в приложении. - person Dave; 30.09.2010
comment
Я делаю это, создавая запись db при запуске сеанса, я беру идентификатор db (идентификатор сервера sql) и снова использую его при выходе из системы / истечении срока действия, чтобы записать длину сеанса. - person Ray; 30.09.2010
comment
Спасибо, Рэй, это отличная идея. Я попробую утром. - person Dave; 01.10.2010
comment
RegenerateCookielessExpiredSessionId было бы лучшим именем - person felickz; 05.07.2016

Во-первых, вы не сможете отслеживать, когда сеансы заканчиваются в производстве, потому что глобальный Session_End не гарантированно срабатывает при использовании любого механизма состояния, кроме InProc.

Сеансовые файлы cookie не являются постоянными, поэтому единственный способ решить проблему, о которой вы упоминаете, - это если пользователь оставляет свой экземпляр браузера открытым, а его сеанс истекает из-за бездействия, а затем повторно посещает страницу. Вы можете записать идентификатор сеанса в Session_Start, а также в Session_End, и ваш журнал базы данных будет более надежным, поскольку вы сможете определить поведение тайм-аута / повторного входа.

Вы можете использовать Session.IsNewSession, чтобы определить, был ли текущий сеанс создан с помощью текущего запроса. (Независимо от предоставленного идентификатора sessionid).

Если вы используете идентификатор сеанса, чтобы отслеживать, вошел ли пользователь в систему, вам следует избегать этого и вместо этого использовать файл cookie asp.net auth, который может иметь настроенный тайм-аут. (это означает, что у самого cookie есть срок действия, который обновляется при каждом просмотре, но по истечении тайм-аута cookie будет отброшен браузером, что потребует повторного входа в систему.

person David    schedule 30.09.2010
comment
Спасибо за помощь. У нас есть HttpModule, который, как мне кажется, должен обрабатывать функциональность завершения сеанса на производственном сервере. Хороший призыв использовать cookie аутентификации, чтобы узнать, находится ли пользователь еще в сети. - person Dave; 30.09.2010