Ведите, как предотвратить многопользовательский для входа в систему во время с помощью идентификатора пользователя?
Я искал Интернет и нашел некоторые пути, но так или иначе они не работают в этих ситуациях:
Предложите меня некоторый путь.
спасибо
haansi
Может быть несколько возможностей. Быстрый ответ:
Поддерживать флаг в базе данных; при каждом входе / выходе обновляйте флаг. Например, при каждом запросе аутентификации вы можете отклонить запрос входа в систему, если флаг уже установлен.
Кроме того, вы можете вести список пользователей в объекте Application
и использовать .Contains
, чтобы узнать, существует ли он уже.
- РЕДАКТИРОВАТЬ -
Давайте попробуем опцию флага базы данных; и предположим, что у вас есть метод с именем StillLoggedIn (User)
, который обновляет дату / время и флаг.
Итак, когда пользователь входит в систему:
Для последующих запросов приложение будет вызывать StillLoggedIn (User)
;
Подготовьте службу Windows, которая будет время от времени просматривать базу данных (скажем, через 5 минут, если у вас 10000 пользователей). Служба будет сравнивать дату / время базы данных с текущей датой / временем и пометить флаг как 0
, если currentTime минус lastUsedTime больше, чем, скажем, 5 минут .
Это может быть что угодно, кроме базы данных и службы Windows.
Здесь нет одного ответа, поскольку это зависит от того, как вы аутентифицируете пользователей. Однако основная логика будет простой - когда пользователь входит в систему, проверяет свое имя пользователя или идентификатор по списку уже вошедших в систему пользователей и, если есть совпадение, не аутентифицирует их (а вместо этого дает им какое-то сообщение с объяснением почему они не могут войти в систему).
Очевидно, что точный способ, которым вы это сделаете, зависит от того, как вы аутентифицируете пользователей и сохраняете данные о пользователях - вам нужно будет предоставить более подробную информацию, если вам нужна дополнительная помощь.
Мы реализовали систему для этого в следующих направлениях:
Мы выбрали вариант базового класса, так как у нас есть два уровня аутентификации:
Основные проблемы, с которыми вы столкнетесь практически с любой системой:
InProc
, событие SessionEnd никогда не срабатывает, если ваш сервер выходит из строя, событие не вызывается и т. Д. проблемы, с которыми вы столкнетесь с таким решением, как мое:
Ответ на комментарий
В ответ на ваш конкретный запрос:
По сути, это не помешает пользователям делиться своими учетными записями, но вызовет у них раздражение, заставляя их продолжать входить в систему. Если вам нужно, вы можете добавить задержку в процесс входа в систему - так что если другой Идентификатор сеанса пытается войти на сайт в течение тайм-аута сеанса (по умолчанию 20 минут) или в другое время, скажем, на основе среднего времени, которое пользователь проводит на странице, а затем отклоняет попытку входа.
Я просмотрел таблицу членства и не увидел ни одного столбца, такого как «IsLoggedIn», поэтому API членства не соответствует этому требованию.
Возможно, вы можете использовать систему Asp.net Cache и пометить пользователя как «LoggedIn». Таким образом вы можете проверить наличие дополнительных логинов.