Как решить эту проблему сессии в ASP.NET, VB.NET? - PullRequest
3 голосов
/ 30 ноября 2010

Как решить эту проблему сеанса в ASP.NET, VB.NET?

Имеются следующие требования:

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

Мы применили средство защиты: Мы сохранили «Is_Loggedin» как столбец с типом данных «бит» в mst_vendorимя таблицы.Когда пользователь входит в систему, мы устанавливаем флаг Is_Loggedin в значение «1», и каждый раз, когда кто-то пытается войти в систему с использованием этой учетной записи, система показывает ошибку «Пользователь уже вошел в систему».

Когда пользователь выходит из системы, он становится равным «0» при вызове процедуры выхода из системы, как только пользователь нажимает кнопку выхода из системы.

Сценарий проблемы:

  1. Когда пользователь закрывает браузер, флаг остается прежним, то есть «1».

  2. Когда питание отключается, оно остается таким же, как «1».

  3. Если время ожидания сеанса после предварительно определенного значения остается неизменным.

  4. Могут быть и другие сценарии, кроме этого.

Есть ли способ сохранить эту внутреннюю маркировку для статуса входа пользователя с помощью объекта приложения?

Это может повысить эффективность системы, а также исключить вышеуказанные проблемные сценарии.

Ответы [ 5 ]

4 голосов
/ 30 ноября 2010

Вы должны использовать файл Global.asax и использовать функцию Session_End.

Session_End: Запускается, когда сеанс пользователя заканчивается, заканчивается или он покидает веб-сайт приложения .

2 голосов
/ 30 ноября 2010

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

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

0 голосов
/ 30 ноября 2010

С самого верхнего уровня вот что вы можете сделать

  • Использовать кэш с SlidingExpiration.

  • Каждый раз, когда пользователь пытается войти в систему, проверяйте кэш с его именем пользователя в качестве ключа. Если в кеше есть запись, вы можете сказать, что пользователь уже вошел в систему и отказать в регистрации.

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

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

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

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

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

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

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

0 голосов
/ 30 ноября 2010

Да, сценарий был бы хорошей идеей.Просто установите время ожидания сеанса равным 5 минутам вместо 20, а затем запишите метод в session.end в файле global.asax, который соответственно обновит базу данных.

0 голосов
/ 30 ноября 2010

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

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

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