Как запретить пользователям входить на мой сайт более одного сеанса? - PullRequest
5 голосов
/ 09 февраля 2012

Я занимаюсь разработкой сайта 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, но это не так!)

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

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

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

привет

Foroughi

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

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

Ответы [ 4 ]

2 голосов
/ 09 февраля 2012

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

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

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

2 голосов
/ 09 февраля 2012

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

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

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

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

РЕДАКТИРОВАТЬ: В качестве последнего пункта в комментариях. Вместо того, чтобы рассматривать ваше требование как ', вы можете иметь только один логин, поэтому, если вы уже вошли в систему, не разрешайте вход в систему ' вы можете изменить на ', вы можете иметь только один логин, если у вас есть открытие сеанса будет отменено, и будет создан новый. '

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

1 голос
/ 09 февраля 2012

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

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

2) Если пользователь пытается войти во второй раз, предложите выйти из предыдущего сеанса.

0 голосов
/ 09 февраля 2012

Я думаю, тебе стоит попробовать что-нибудь. как это:

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

 ID
 UserID
 Flag

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

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

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