Событие AuthenticateRequest
Q 1. Насколько я понимаю FormsAuthenticationModule
подписан на AuthenticateRequest
событие, и, следовательно, только после этого события FormsAuthenticationModule
называется. Но следующие цитаты меня немного смутили:
AuthenticateRequest
сигнализирует о том, что настроенный механизм аутентификации аутентифицировал текущий запрос.- Разве приведенная выше цитата не предполагает, что когда
AuthenticateRequest
событие инициировано, запрос (он же пользователь) уже аутентифицирован?
- Разве приведенная выше цитата не предполагает, что когда
Подписка на
AuthenticateRequest
Событие гарантирует, что запрос будет аутентифицирован перед обработкой подключенного модуля или обработчика события.- Насколько я понимаю, эта цитата, если мы подпишемся на
AuthenticatedRequest
, тогда наш обработчик события будет вызван доFormsAuthenticationModule
? таким образомApplication_AuthenticateRequest()
будет вызван раньшеFormsAuthenticationModule
называется?
- Насколько я понимаю, эта цитата, если мы подпишемся на
Вопрос 2. Книга, из которой я учусь, предполагает, что в Application_AuthenticateRequest()
мы можем проверить, является ли пользователь участником определенной роли, и если нет, мы можем автоматически добавить пользователя:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated && Roles.Enabled)
{
//here we can subscribe user to a role via Roles.AddUserToRole()
}
}
Судя по приведенному выше коду, Application_AuthenticateRequest()
называется после FormsAuthenticationModule
был вызван, но где-то еще та же книга подразумевает, что Application_AuthenticateRequest()
называется до FormsAuthenticationModule
:
Application_AuthenticateRequest
вызывается непосредственно перед выполнением аутентификации. Это отправная точка для создания собственной логики аутентификации.
Что мне не хватает?
Thanx
2 ответа
Кажется, что FormsAuthenticationModule обрабатывается первым. Этот модуль обычно более ранний, чем любой пользовательский модуль в конвейере ASP.NET, поэтому при запуске AuthenticateRequest сначала вызывается FormsAuthenticationModule, выполняет свою работу, а затем вызывается обработчик событий вашего модуля.
Если вы действительно хотите углубиться в это, я предлагаю попробовать отладить код ASP.NET самостоятельно. Вот пост, как настроить ваш VS:
РЕДАКТИРОВАТЬ: я смог подтвердить это поведение, настроив веб-проект с пользовательским модулем и обработчиками событий в Global.asax. Взгляните на исходный код HttpApplication.InitInternal, порядок инициализации следующий:
- инициализация интегрированных модулей: FormsAuthenticationModule подключается к событию HttpApplication.AuthenticateRequest
- инициализация пользовательских модулей: пользовательский модуль подключается к событию HttpApplication.AuthenticateRequest
- инициализация класса Global (global.asax): здесь мы подключаемся к событию AuthenticateRequest
- HttpApplication.InitInternal ищет методы в классе Global, следуя определенному шаблону имени (например, Application_AuthenticateRequest), сопоставляет их с событием и подключает
После инициализации, когда запускается AuthenticateRequest, обработчики событий вызываются в том порядке, в котором они инициализированы, поэтому:
- Обработчик событий FormsAuthenticationModule.AuthenticateRequest
- CustomModule.AuthenticateRequest обработчик событий
- Обработчик события Global.AuthenticateRequest
- Метод Global.Application_AuthenticateRequest
Если я что-то не пропустил, не существует механизма для остановки обработчиков событий, поэтому независимо от результата FormsAuthenticationModule.AuthenticateRequest все равно будут вызываться следующие обработчики. Надеюсь, это поможет.
Если вы хотите получить доступ к объекту User, я бы предложил вам использовать
protected void Application_Start()
{
PostAuthenticateRequest += Application_PostAuthenticateRequest;
}
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
if(User.Identity.IsAuthenticated)
{
//Do stuff here
}
}