Прекратить повторное использование идентификатора сессии по истечении срока - PullRequest
2 голосов
/ 30 сентября 2010

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

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

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

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

но сеансы по-прежнему используются повторно.

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

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

Спасибо

Dave

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

Ответы [ 2 ]

4 голосов
/ 30 сентября 2010

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

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

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

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

4 голосов
/ 30 сентября 2010

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

По умолчанию только URL без файлов cookie переиздан, когда RegenerateExpiredSessionId включен

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

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

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

...