Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6489
Последний выпуск: 19.06.2015

Доступ к сайту для одного логина одна активная сессия

67K
31 января 2011 года
MojoDS
1 / / 31.01.2011
Здравствйте.
Нужно организовать доступ к сайту таким образом, чтобы под одним логином можно было зайти только одному пользователю, а не двум или более с разных компов.
Решено организовать доступ по следующему алгоритму:

В БД (Оракл) для пользователя добавляем признак активности.
При логине - если не активный - выставляем признак активности, сохраняем SessionID и IP-адрес
На "Выход" мы снимаем признак активности.

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

Если сессия отвалилась(или был закрыт браузер), то при отключении сессии снимать флаг активности.

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

Пробовал по событию Session_End в Global.asax.cs, но в этот момент сессия уже отвалилась и до БД уже не достучаться.

Подскажите как можно решить данную проблему? Может есть како-то другой способ?
Заранее спасибо за ответы.
227
31 января 2011 года
UAS
2.0K / / 19.07.2006
Обычно в БД создается поле "expires" типа DATETIME (как в оракл аналог называется - хз), в котором указывается дата истечения времени жизни сессии. Какой-то скрипт должен будет периодически запускаться и убирать флаг активности, если текущее время больше "expires".

Сверку по IP лучше не делать - достаточно сессии. Тем более за одним IP порой могут сидеть целые дома и поселения.
7
31 января 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: UAS
Обычно в БД создается поле "expires" типа DATETIME (как в оракл аналог называется - хз), в котором указывается дата истечения времени жизни сессии.

Сессии в ASP.NET зло, их использования стоит избегать, а особенно, никогда не пользоваться Session_End - гарантий его вызова совершенно нет. Имхо, для решения задачи автора достаточно кукисов для распознавания активности и ASP-шного кэша (благо у него есть обработчик протухания).
Алгоритм:
1) при авторизации пользователя складываем ему в кукисы токен "сессии" - GUID
2) при последующих обращениях пользователя нужно проверять, валиден ли этот токен

Валидация проста: нужно проверять, нет ли другого активного пользователя с GUID-ом отличным от того что получили.
Заводим таблицу: (ID пользователя, токен сессии, дата последней активности). Легитимность токена сессии можно определять сравнивая текущую дату и дату активности, в конфигах можно задать допустимый интервал.

Для уменьшения количества обращений к таблице можно использовать стандартный ASP-шный кэш. При том его можно использовать достаточно хитро: при протухании записи кэш может вызывать пользовательский обработчик - в нем-то и нужно поместить обновление описанной выше таблицы.


Рассказанное выше стоит реализовывать в виде Http-модуля.

7
31 января 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: UAS
Какой-то скрипт должен будет периодически запускаться и убирать флаг активности, если текущее время больше "expires".

Это дотнет - тут нет скриптов. ;)
Тут натуральный процесс длительное время находящийся в памяти.

227
31 января 2011 года
UAS
2.0K / / 19.07.2006
Цитата: hardcase
Это дотнет - тут нет скриптов. ;)
Тут натуральный процесс длительное время находящийся в памяти.


Эхх, я видать просто ещё мыслю временами обычного ASP =) Да и с ним я работал только "по-наслышке":) Но, думал, принципы в целом одинаковые.

7
31 января 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: UAS
Но, думал, принципы в целом одинаковые.


Варюсь только в ASP.NET (в JSP подход аналогичен), потому для меня кажутся невероятной дикостью скрипты в PHP, когда цикл работы интерпретатора равен HTTP-запросу.

263
14 февраля 2011 года
bave
456 / / 07.03.2004
При использовании Membership-а кстати признак активности пользователя выставляется сам собой - вернее не сам собой, но там это уже предусмотрено.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог