Выход из других сеансов пользователя в ASP.NET MVC3 с проверкой подлинности с помощью форм
Я создаю приложение ASP.NET MVC3 с использованием проверки подлинности с помощью форм, и я хотел бы выйти из системы всех существующих сеансов для пользователя, когда этот пользователь входит в систему. Я пытаюсь предотвратить вход и работу нескольких человек на разных рабочих станциях под тот же аккаунт.
Есть ли стандартный способ справиться с этим? Выйти из существующего сеанса легко, но я не нашел способа проверить другие сеансы с помощью той же учетной записи и выйти из них.
У меня есть несколько идей о том, как взломать это, но мне любопытно, есть ли для этого установленный метод с использованием IIS или API FormsAuthentication.
2 ответа
Из-за отсутствия состояния сети вы не можете "выйти" из сеанса, пока они не сделают следующий запрос (например, сеанс может быть сохранен в файле cookie, который не может быть записан на клиенте вне контекста взаимодействие запрос-ответ).
Есть еще решение, которое предполагает, что вы используете состояние сеанса, и, предпочтительно, у вас есть общий базовый контроллер для всех ваших контроллеров, требующих "Аутентификация".
После успешного входа в систему создайте токен (возможно, guid) и сохраните его вместе с сеансом. Также запишите это в хранилище всего приложения (например, базу данных или контекст приложения) с ключом идентификатора пользователя.
В базовом контроллере (или иным образом вам нужно создать фильтр действий) проверьте токен в сеансе с токеном, зарегистрированным для идентификатора пользователя в хранилище всего приложения. Если они не совпадают, выйдите из системы, используя стандарт SignOut()
вызов.
Вы могли бы использовать Membership.IsOnline
свойство, основанное на LastActivityDate
:
Пользователь считается подключенным к сети, если текущая дата и время минус значение свойства UserIsOnlineTimeWindow раньше, чем LastActivityDate для пользователя.