Аудит входа и выхода пользователей в ASP.NET 2.0 приложении при использовании Forms Authentication

07.02.2010 20:15 / Артём Волк / 1138 просмотров / ...

Возникла необходимость к существующему приложению на 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'а.