Как аудиту когда пользователь покидает приложение ASP.NET
Вопрос
В ASP.NET Я ищу способ проверки пользователя, покидающего мое приложение.Чтобы быть конкретным, я хотел бы вставить запись 'logout' в таблицу аудита в SQL Server, когда сеанс пользователя прекращается / уничтожается по какой-либо причине (не обязательно из-за вызова session.abandon)
У меня есть класс 'SessionHelper', который управляет установщиками / получателями сеанса.
Я попытался отправить сообщение обратно в Session_End в Global.asax, но оно никогда не запускало это событие даже после истечения тайм-аута.
Я пробовал переопределять 'finalize' в классе SessionHelper и делать это там, когда класс будет уничтожен, но это событие также не сработало.
Я бы попробовал реализовать IDisposable в SessionHelper, но я не знаю, где его вызвать, чтобы он всегда вызывался.
Как правильно проводить аудит пользователя, покидающего ваше приложение ASP.NET ?
Спасибо!
Решение
Событие Session_End запускается только в том случае, если у вас есть сеансы InProc.SQL или управление сеансами сервера состояния не вызовут это событие.Если вы можете, вернитесь к сеансам InProc и используйте это событие.
Кроме того, вы получите не очень хорошие решения.ASP.NET не предлагает способа просмотреть текущий список сеансов на сервере (по крайней мере, пользователи StackOverflow об этом не знают, поскольку я уже задавал этот вопрос), поэтому вы не можете использовать задание для проверки, когда они будут уничтожены.
Следующим лучшим решением было бы сохранить где-нибудь "время последнего доступа" для ваших пользователей и использовать его для определения времени ожидания сеанса.Однако реализация такого задания сложна (например, вы можете пропустить события выхода из системы, если пользователь быстро входит в систему)...
Так что идеального решения здесь нет.
Другие советы
Обратите внимание, конечно, на "правильный способ", но вот как я делал это в прошлом.
Иметь отметку даты и времени "активен", связанную с записью пользователя в базе данных.Каждый раз, когда пользователь получает доступ к странице, она обновляется до текущего времени.Если кто-то не заходил на страницу, скажем, в течение 15 минут, то этот пользователь регистрируется как событие "выхода из системы", а отметке времени присваивается значение NULL.
В лучшем случае ваша запись о выходе из системы будет разумным предположением, даже если вы заставите события сеанса работать правильно, о том, когда пользователь покинул ваш сайт / приложение.Метод, который вы могли бы использовать, заключается в том, чтобы поместить время выхода из системы в базу данных, когда пользователь входит в систему, и просто продолжать обновлять запись с указанием будущего времени по мере использования системы.Вот общая схема недавно созданной таблицы сеансов, которую я использовал:
[Id] [Uid] [LoginInOn] [ExpiresOn]
1 johndoe 10/14/2008 10:47 10/14/2008 11:07
В этой таблице я просто продолжаю обновлять столбец ExpiresOn по мере взаимодействия пользователя с приложением (текущее время + 20 минут).Если они попытаются взаимодействовать после истечения срока действия, то я знаю, что они бездействовали в течение 20 минут, и принудительно введу новый логин.Для целей отчетности я знаю, что пользователь вышел из системы, если текущее время превышает ExpiresOn.Вы можете стать более сложным, чем это.Например, я переношу свои данные из таблицы сеансов, указанной выше, в таблицу отчетов с помощью обычного процесса.Это просто для того, чтобы таблица сеансов была небольшой, поскольку с ней взаимодействует множество материалов.