контролировать онлайн статус пользователя в asp.net - PullRequest
1 голос
/ 02 мая 2011

В моем приложении я не хочу, чтобы одно и то же имя пользователя входило в систему одновременно, поэтому у меня есть идея, но я не уверен, что это правильно.

1) Когда пользователь входит в систему, обновите статус (столбец «isOnLine» в пользовательской таблице в db) и сохраните время входа в сеанс, например:

Внутри метода входа в систему:

DateTime ltime=Datetime.now();

Dbservice.executeSql(update User set(isOnLine,lastLoginTime) value("1",ltime));

Session["logintime"]=ltime;

Когда другой пользователь пытается войти в систему, проверьте таблицу, чтобы узнать, зарегистрирован ли статус этого пользователя или нет. Если да, установите для «isOnline» значение «0», тогда он сможет войти в систему сейчас.

2) В методе Page_Onload () каждой защищенной страницы проверьте, равно ли время входа в сеанс времени в db:

string logtime=Dbservice.executeSelect("select lastLoginTime from user where xxxxx").Rows[0]["lastLoginTime"];

if(!Session["logintime"]==logtime){

  //this user should offline now,redirect it to the login page

}

Интересно, мой путь правильный или нет?

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

Так как вся страница на нашем сайте защищена!.

Спасибо.

UPDATE:

Запрещено одновременное подключение двух пользователей к сети, но разрешено, чтобы более поздний пользователь с правильным паролем мог принудительно отключить бывшего пользователя. Например:

user1 логин с "username = bill" и "пароль = 000", значит, он сейчас на связи.

тогда user2 попытайтесь войти через "username = bill" и "пароль = 123", так как его пароль недействителен, поэтому его запрос отклонен.

user3 попробуйте войти через "username = bill" и "пароль = 000", так как его пароль действителен, поэтому у него есть выбор сделать пользователь1 офлайн.

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

Ответы [ 2 ]

1 голос
/ 02 мая 2011

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

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

  1. Вам нужна таблица базы данных, которая будет отслеживать сеанс пользователя.Важным полем будет время последнего обращения и активное / неактивное состояние.
  2. Во время входа в систему, если в db существует активный сеанс для того же пользователя, пользователь не может войти в систему
  3. Задание для отметкисеанс неактивен после определенного времени ожидания.Это время ожидания должно быть немного больше (скажем, х минут), чем время ожидания сеанса веб-сервера.
  4. Периодическое обновление кода приложения для сброса последнего доступного значения в дБ, чтобы задание не помечало сеанс как неактивный.
  5. Поскольку db time-out = time-out веб-сервера + x, вы можете объединить обновления на x минут, что сократит количество обращений к вашей базе данных.Например, скажем, x = 3 минуты, тогда все запросы в течение 3 минут не изменят время последнего обращения к базе данных (там, уменьшив количество обращений к базе данных).Вы можете отслеживать время последнего обновления базы данных в состоянии сеанса и в каждом запросе проверять это значение, чтобы увидеть, нужно ли обновлять базу данных или нет (т. Е. Текущее время> последнее обновление базы данных + x, затем обновить последнее доступное значение в базе данных).

Третий шаг (задание) является необязательным, так как вы можете изменить свой чек в # 2, чтобы увидеть, будет ли попытка входа в систему через n минут (где n> время сеанса) последнего времени доступа.

0 голосов
/ 02 мая 2011

Чтобы логика проверяла, подключен ли пользователь к сети, я могу добавить его в событие Global.asax Application_AcquireRequestState, поскольку все страницы защищены.

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