Доступ к сайту для одного логина одна активная сессия
Нужно организовать доступ к сайту таким образом, чтобы под одним логином можно было зайти только одному пользователю, а не двум или более с разных компов.
Решено организовать доступ по следующему алгоритму:
В БД (Оракл) для пользователя добавляем признак активности.
При логине - если не активный - выставляем признак активности, сохраняем SessionID и IP-адрес
На "Выход" мы снимаем признак активности.
Если при логине выясняется, что этот клиент уже активный, то проверить его SessionID и IP-адрес
Если IP другой, то надо не пускаем - говорим, что есть уже активная сесссия.
Если IP тот же, тогда сказать, что уже есть активная сессия и чтобы он ее закрыл.
Если сессия отвалилась(или был закрыт браузер), то при отключении сессии снимать флаг активности.
Проблема в том, как снять флаг активности, когда отвалилась сессия или браузар был закрыт.
Пробовал по событию Session_End в Global.asax.cs, но в этот момент сессия уже отвалилась и до БД уже не достучаться.
Подскажите как можно решить данную проблему? Может есть како-то другой способ?
Заранее спасибо за ответы.
Сверку по IP лучше не делать - достаточно сессии. Тем более за одним IP порой могут сидеть целые дома и поселения.
Сессии в ASP.NET зло, их использования стоит избегать, а особенно, никогда не пользоваться Session_End - гарантий его вызова совершенно нет. Имхо, для решения задачи автора достаточно кукисов для распознавания активности и ASP-шного кэша (благо у него есть обработчик протухания).
Алгоритм:
1) при авторизации пользователя складываем ему в кукисы токен "сессии" - GUID
2) при последующих обращениях пользователя нужно проверять, валиден ли этот токен
Валидация проста: нужно проверять, нет ли другого активного пользователя с GUID-ом отличным от того что получили.
Заводим таблицу: (ID пользователя, токен сессии, дата последней активности). Легитимность токена сессии можно определять сравнивая текущую дату и дату активности, в конфигах можно задать допустимый интервал.
Для уменьшения количества обращений к таблице можно использовать стандартный ASP-шный кэш. При том его можно использовать достаточно хитро: при протухании записи кэш может вызывать пользовательский обработчик - в нем-то и нужно поместить обновление описанной выше таблицы.
Рассказанное выше стоит реализовывать в виде Http-модуля.
Это дотнет - тут нет скриптов. ;)
Тут натуральный процесс длительное время находящийся в памяти.
Тут натуральный процесс длительное время находящийся в памяти.
Эхх, я видать просто ещё мыслю временами обычного ASP =) Да и с ним я работал только "по-наслышке":) Но, думал, принципы в целом одинаковые.
Варюсь только в ASP.NET (в JSP подход аналогичен), потому для меня кажутся невероятной дикостью скрипты в PHP, когда цикл работы интерпретатора равен HTTP-запросу.