Аудит входа и выхода пользователей в ASP.NET 2.0 приложении при использовании Forms Authentication
Возникла необходимость к существующему приложению на ASP.NET 2.0, которое использует Forms Authentication добавить регистрацию входа (login) и выхода (logout) пользователей.
С регистрацией события логина и «корректного» выхода (FormsAuthentication.SignOut()) пользователей проблем не возникло. В приложении использовалась также функция «Запомнить меня», реализованная стандартным для Forms Authentication способом
Для отслеживания логина пользователя, который отметил галочку «Запомнить меня» можно использовать такой способ:
if (Request.IsAuthenticated && Session.IsNewSession)
{
// Регистрируем логин пользователя, который вернулся с cookie
}
Для регистрации «выхода» пользователя по тайм-ауту сессии необходимо сначала в сессию сохранить какой-то идентификатор пользователя, например так:
Session["SOME_USER_ID"] = SomeUserIdentifier;
Нужно это из-за того, что следующий обработчик (определяется в Global.asax) будет выполнятся вне HTTP-контекста и свойство HttpContext.Current.User не будет доступно.
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
try
{
if (Session["SOME_USER_ID"] != null)
{
// Регистрируем выход по таймауту
}
}
catch { }
}
Ограничения такого способа описаны в комментарии, так же непонятно, будет ли вызван этот обработчик при рестарте (recycling'e) веб-сайта или application pool'а.
