Убить сеанс Asp.Net, когда браузер или вкладка закрыты - PullRequest
1 голос
/ 20 февраля 2012

Я использую проверку подлинности с помощью Asp.Net 4. В тот момент, когда пользователи нажимают на ссылку выхода из системы, я очищаю сеанс и вызываю FormsAuthentication.SignOut(), и это не позволяет пользователям возвращаться на сайт без повторного входа в систему. .

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

Есть идеи, как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 20 февраля 2012
1 голос
/ 20 февраля 2012

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

О закрытии вкладки вы не знаете, открывается ли у пользователя другая вкладка.

Возможное решение, возможно, заключается в том, чтобы каждые 10 секунд возвращаться к серверу, чтобы активировать эту аутентификацию или нет, и установить аутентификацию на завершение через 20 секунд. Так что, если нет какого-либо сигнала, пользователь ушел. Это может быть сделано с помощью JavaScript. С другой стороны, это не позволяет пользователю выйти из системы после нескольких минут бездействия, поэтому вам может потребоваться сочетание этой логики с чем-то другим.

0 голосов
/ 26 июля 2014

Я ответил на другой вопрос, который имел проблему с прерыванием сеанса, когда пользователь редактировал файл web.config на работающем сайте. Они отслеживали пользователей, которые все еще входили в систему с переменными сеанса (опасно). Но придумали решение (непроверенное решение), которое могло бы помочь людям здесь.

FormsAuthentication позволяет поддерживать активность человека и войти в него на неопределенный срок. Но если они становятся неактивными, например, Через 20 минут они выйдут из системы, что приятно. Но выйти из них во время закрытия их браузера невозможно (дождитесь его ...), так как установка значения времени ожидания 0 приведет к их постоянному входу и выходу из системы.

Итак, решение: во время входа пользователя в систему с помощью FormsAuthentication вы также можете установить стандартный файл cookie переменной сеанса, который будет удален при закрытии браузера. Этот файл cookie содержит неидентифицирующую информацию, не связанную с учетной записью. Просто "залогинен: да".

Теперь весь ваш код должен быть на главной странице / materlayout - это высокоуровневый вызов в цикле страницы или конструктор цикла страницы (или даже пользовательский атрибут), который проверял бы и cookie, и идентификацию пользователя:

if(!HasLoginCookie() || !System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{
   // redirect user to log in page.
}

Обычно, если cookie удаляется при закрытии браузера, вы перенаправляете пользователя на страницу входа.

Надеюсь, что это помогает (и работает. Как я уже говорил, не проверено).

0 голосов
/ 20 февраля 2012

Лучшее, что вы можете сделать, - это когда ваш пользователь явно выходит из системы, чтобы также вызвать Session.Abandon(), чтобы удалить сеанс этого пользователя.Но, как говорили другие, нет способа узнать, закрывается ли вкладка / окно, не выполнив выход таким образом.Сеанс будет просто зависать на сервере до истечения срока его действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...