Как запретить пользователям входить на мой сайт более одного сеанса?


Я разрабатываю ASP.net сайт (с использованием .NET 4, EF, jQuery Ajax, SQL Server 2008 R2). В этом месте я хочу предотвратить multi-login. Я имею в виду, если вы входите на сайт, вы не можете войти на сайт снова с другого браузера или компьютера, так как вы уже вошли в систему.

Я сажаю идею и развиваю ее на своем сайте, но у нее есть проблема, и именно из-за этой проблемы я решаю задать вопрос здесь

У меня есть такая таблица SQL Server:

Id        [int]            NOT NULL   IDENTITY(1,1)   //PK
UserId    [int]            NOT NULL                   //Relation to User table
Key       [nvarchar](50)   NOT NULL                   //Unique

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

UserId = The Id of logged in user 
Key = Session.SessionId

А также есть код для удаления записи из этой таблицы, который выполняется, когда:

  1. пользователь пытается выйти из своей учетной записи
  2. на Session_End событие в global.asax

Все работает правильно и идеально, Просто:

Проблема: когда пользователь закрывает браузер, эта строка не удаляется (я думал, что когда он закрывает браузер, его строка в этой таблице будет удалена по событию Session_End, но это произошло нет!!!)

Что я могу сделать? Есть ли решение этой проблемы? Должен ли я изменить свою стратегию или есть решение?

Извините за мой плохой синтаксис. Я новичок в английском языке

Любая идея может быть полезной

С уважением

Форуги

UPDATE1 : я не использую членство ASP и сам управляю своими пользователями

UPDATE2 : я использую режим InProc для моего состояния сеанса с таймаутом 20 минут

4   5   2012-02-09 12:08:47

4 ответа:

Событие Session_End не срабатывает при закрытии браузера, оно срабатывает, когда сервер не получил запрос от пользователя в определенный промежуток времени (по умолчанию 20 минут). Это означает, что если вы используете Session_End для удаления пользователей, они не смогут войти в систему в течение 20 минут после закрытия браузера.

На ум приходят две альтернативные стратегии

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

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

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

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

Во-первых, не используйте базу данных в качестве системы обмена сообщениями. Это верный путь к катастрофе.

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

После получения пинга обновите последнее время активности идентификатора пользователя и удалите все идентификаторы пользователя, которые имеют "тайм-аут".

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

1) изменить состояние (удалить запись в вашем случае), когда пользователь выходит из системы или когда сеанс заканчивается (сеанс заканчивается после n минут бездействия, см. Ваш веб-сайт.config и global.asax для обработчика событий)

2) если пользователь пытается войти во второй раз, предложите опцию выхода из предыдущей сессии.

Я думаю, что вы должны попробовать smth. вот так:

Структура таблицы:

 ID
 UserID
 Flag

Когда пользователь вошел в систему, вы обновляете таблицу и устанавливаете флаг true или 1 и когда он выйдет из системы установите его в false или 0

Когда пользователь закрыл свой браузер, вы должны решить, выходите ли вы из него или нет. если да-вы ловите это событие как Session_End и выходите из него самостоятельно, обновляя таблицу до ложь или 0