Выход из других сеансов пользователя в ASP.NET MVC3 с проверкой подлинности с помощью форм

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

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

У меня есть несколько идей, как это взломать, но мне любопытно, есть ли для этого установленный метод с использованием IIS или FormsAuthentication API.


person awright    schedule 18.05.2011    source источник


Ответы (2)


Из-за отсутствия состояния в Интернете вы не можете «выйти из сеанса», пока они не сделают свой следующий запрос (например, сеанс может поддерживаться в файле cookie, который не может быть записан на клиенте вне контекста взаимодействие запрос-ответ).

По-прежнему существует решение, предполагающее, что вы используете состояние сеанса, и желательно, чтобы у вас был общий базовый контроллер для всех ваших контроллеров, требующих «аутентификации».

После успешного входа в систему сгенерируйте токен (возможно, guid) и сохраните его вместе с сеансом. Также напишите это в хранилище всего приложения (например, в базе данных или контексте приложения) с ключом идентификатора пользователя.

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

person Ethan Cabiac    schedule 18.05.2011
comment
Это хорошо. Я склонялся в этом направлении, но хорошо иметь подтверждение. - person awright; 19.05.2011

Вы можете использовать свойство Membership.IsOnline, которое основан на LastActivityDate:

Пользователь считается подключенным к сети, если текущая дата и время за вычетом значения свойства UserIsOnlineTimeWindow раньше, чем LastActivityDate для пользователя.

person Darin Dimitrov    schedule 18.05.2011
comment
Это может помочь определить, находится ли пользователь в сети, но я не нашел API для выхода из других сеансов. - person awright; 18.05.2011
comment
@ Томас, почему вы хотите выйти из других сессий? Если вы хотите разрешить один сеанс, просто скажите пользователю закрыть другие сеансы перед входом в систему. - person Darin Dimitrov; 18.05.2011
comment
Проблема заключается в том, что пользователь не может позволить другим людям использовать свой логин. Я хочу снизить риск того, что несколько человек будут работать под одной учетной записью. - person awright; 18.05.2011