Как проводить аудит, когда пользователь покидает приложение ASP.NET - PullRequest
2 голосов
/ 14 октября 2008

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

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 14 октября 2008

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

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

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

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

2 голосов
/ 14 октября 2008

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

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

1 голос
/ 14 октября 2008

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

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

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

...