Как проводить аудит, когда пользователь покидает приложение ASP.NET

В ASP.NET я ищу способ проверить пользователя, покидающего мое приложение. Чтобы быть конкретным, я хотел бы вставить запись о выходе из системы в таблицу аудита в SQL Server, когда сеанс пользователя прекращен / уничтожен по какой-либо причине (не обязательно из-за вызова session.abandon)

У меня есть класс SessionHelper, который управляет установщиками / получателями сеанса.

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

Я пробовал переопределить finalize в классе SessionHelper и сделать это там, когда класс уничтожен, но это событие тоже не сработало.

Я бы попробовал реализовать IDisposable в SessionHelper, но я не знаю, где его вызвать, чтобы он всегда вызывался.

Как правильно контролировать пользователя, покидающего ваше приложение ASP.NET?

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 422
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обратите внимание на «правильный способ», но вот как я делал это в прошлом.

Иметь отметку даты и времени «активно», связанную с записью пользователя в базе данных. Каждый раз, когда пользователь обращается к странице, она обновляется до текущего времени. Если кто-то не обращался к странице, скажем, 15 минут, то этот пользователь регистрируется как событие «выхода из системы», а метка времени устанавливается на NULL.

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

stephenbayer 14.10.2008 19:54

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

[Id]  [Uid]    [LoginInOn]        [ExpiresOn]  
 1    johndoe  10/14/2008 10:47   10/14/2008 11:07  

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

Ответ принят как подходящий

Событие Session_End запускается, только если у вас есть сеансы InProc. Управление сеансом SQL или сервера состояний не вызовет это событие. Если можете, вернитесь к сеансам InProc и используйте это событие.

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

Следующим лучшим вариантом было бы сохранить где-нибудь «время последнего доступа» для ваших пользователей и использовать его для определения тайм-аута сеанса. Однако реализация такой работы сложна (вы можете пропустить события выхода, например, если пользователь входит / выходит быстро) ...

Так что идеального решения здесь нет.

Другие вопросы по теме