Запретить несколько входов в систему для одного пользователя в ASP .Net - PullRequest
4 голосов
/ 26 января 2010

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

Я смотрел на реализацию в прошлом системы пост-типов; когда пользователь входит в систему, пользователи старшего возраста просто удаляются. Кажется, что FormsAuthentication.Signout() работает только для текущего пользователя.

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

Ответы [ 2 ]

4 голосов
/ 26 января 2010

У меня недавно была такая же проблема, и вот как я ее решил. Я поместил значение в кэш, срок действия которого истекает через X минут. В моем коде у меня есть обратный вызов AJAX каждые Y минут (у

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

Несколько замечаний по этой технике:

  1. Вы не можете использовать SessionID как предложено выше, потому что это меняет каждый раз, когда переменная сеанса вызывается в зависимости от вашей настройки. Мы столкнулся с этим лицом первым на нашем Первая попытка сделать эту работу.

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

  3. Если пользователь пытается войти до кэша истекает (скажем, после закрытия окно) они получат сообщение что другой пользователь вошел в систему.
  4. При установке значения кэша вы не можете использовать только числа, поскольку они конфликтуют с некоторыми внутренними компонентами ASP.NET. Убедитесь, что вы добавили ключ в начало значения.
2 голосов
/ 26 января 2010

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

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

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

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