Выход пользователя из системы по окончании сеанса ASP.NET MVC

В ASP.NET MVC в одном из сервисов WCF я помещаю объект в объект HttpContext.Current.Session.

Когда время сеанса истекло, и сеанс очищен от всех объектов, я хочу выйти из системы, но не смог найти способ.

В Global.asax

когда метод Session_end вызывается, объект Response и HttpContext.Current оба равны нулю.

Любые идеи, как выйти из системы приветствуется.

4 ответа

Решение

Когда время сеанса истекает, пользователь больше не существует. Если вы пытаетесь очистить открытые окна браузера, вам нужно реализовать таймер, основанный на времени, оставшемся до истечения сеанса.

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

Никаких дополнительных действий не требуется.

Я не уверен в вашей имплантации WCF, так как я не очень разбираюсь в WCF. В настоящее время я создаю большое стипендиальное приложение, и мы хотим ограничить количество входов в систему для одного пользователя. У меня есть настройки таблицы для отслеживания идентификатора пользователя и GUID, которые я храню в их Auth Cookie. Вместо этого вы можете использовать идентификатор сессии. Я буду кэшировать таблицу и обновлять кэш каждый раз, когда добавляю или удаляю запись. Я использую SignalR (вы можете получить как пакет NuGet) для поддержания связи с каждым из наших клиентов. Когда они закрывают свой браузер, SignalR может немедленно сообщить, что пользователь ушел, и я могу завершить его запись из таблицы отслеживания сеансов. В вашем случае вы можете убить сеанс. Кроме того, если пользователь пытается войти снова, я вижу, что он уже вошел в систему. Затем я прекращаю исходную сессию и позволяю ему войти в новую.

Потребовалось несколько часов, чтобы привыкнуть к использованию SignalR, и я очень рекомендую видео о Plural Sight.

Установите оба таймаута в следующей конфигурации на точное количество минут. Убедитесь, что вы установили для параметра slideExpiration значение true, то есть аутентификация будет продолжаться до 30 минут после каждого запроса, так как сеанс будет продолжаться после каждого запроса.

<authentication mode="Forms">
  <forms loginUrl="~/Auth/SignOn.aspx" timeout="30" slidingExpiration="true" />
</authentication>

<sessionState timeout="30" />

Я думаю, что неправильно поддерживать синхронизацию между cookie-файлами сессии и аутентификации. Сессия и cookie - разные вещи. Вы можете войти с несколькими пользователями в течение одного и того же периода сеанса. Вы начинаете новый сеанс, когда открываете некоторый URL-адрес, и он заканчивается, когда вы закрываете окно, или срок его действия истекает на стороне сервера. Для получения дополнительной информации о связи между сеансом и куки-файлами аутентификации, пожалуйста, прочитайте следующий ответ: куки-файлы asp.net, аутентификация и время ожидания сеанса

В любом случае, если вы хотите сделать это, вы можете использовать один маленький трюк. Вы должны периодически вызывать свой сервер с помощью ajax-вызова, например, вызывать страницу YourWebsite.com/chcecksession каждые n секунд. Там вы должны проверить наличие переменной сеанса. Если он больше не существует, просто вызовите FormsAuthentication.SignOut(), обновите страницу и пользователь выйдет из системы.

Другие вопросы по тегам