Событие AuthenticateRequest
Q 1. Насколько я понимаю, FormsAuthenticationModule
подписывается на AuthenticateRequest
событие, и, таким образом, только после этого события вызывается FormsAuthenticationModule
. Но следующие цитаты меня немного смутили:
-
Событие AuthenticateRequest
сигнализирует, что настроенный механизм аутентификации аутентифицировал текущий запрос.
- Не указано ли выше, что при событии
AuthenticateRequest
запрос (как пользователь) уже прошел проверку подлинности?
-
Подписка на событие AuthenticateRequest
гарантирует, что запрос будет аутентифицирован до обработки подключенного модуля или обработчика событий.
- Насколько я понимаю эту цитату, если мы подписываемся на
AuthenticatedRequest
, тогда наш обработчик событий будет вызываться до FormsAuthenticationModule
? Таким образом, Application_AuthenticateRequest()
будет вызываться до вызова FormsAuthenticationModule
?
Q 2. Изучите книгу Im из предложения, что в 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
Ответы
Ответ 1
Кажется, что сначала обрабатывается FormsAuthenticationModule. Этот модуль обычно раньше любого настраиваемого модуля в конвейере ASP.NET, поэтому, когда AuthenticateRequest запущен, FormsAuthenticationModule будет вызван первым, выполнит его работу, а затем вызывается обработчик событий вашего модуля.
Если вы действительно хотите углубиться в это, я предлагаю попробовать самостоятельно отлаживать код ASP.NET. Вот сообщение о том, как настроить свой VS:
http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx
EDIT. Я смог подтвердить это поведение, настроив веб-проект с помощью настраиваемого модуля и обработчиков событий в Global.asax. Взгляните на исходный код HttpApplication.InitInternal, порядок инициализации выглядит следующим образом:
- инициализация интегрированных модулей: FormsAuthenticationModule подключается к событию HttpApplication.AuthenticateRequest
- инициализация настраиваемых модулей: пользовательский модуль подключается к событию HttpApplication.AuthenticateRequest
- инициализация глобального класса (global.asax): здесь мы подключаемся к событию AuthenticateRequest
- HttpApplication.InitInternal выполняет поиск методов в глобальном классе, следующих за определенным шаблоном имени (например, Application_AuthenticateRequest), сопоставляет их с событиями и вызывает подключение
После инициализации, когда срабатывает AuthenticateRequest, обработчики событий вызывают в порядке их инициализации, поэтому:
- Обработчик событий FormsAuthenticationModule.AuthenticateRequest
- Обработчик события CustomModule.AuthenticateRequest
- Обработчик событий Global.AuthenticateRequest
- Метод Global.Application_AuthenticateRequest
Если я что-то пропустил, не существует механизма для остановки обработчиков событий, поэтому независимо от результата FormsAuthenticationModule.AuthenticateRequest последующие обработчики будут вызываться. Надеюсь, что это поможет.
Ответ 2
Если вы хотите получить доступ к объекту User, я предлагаю вам использовать
protected void Application_Start()
{
PostAuthenticateRequest += Application_PostAuthenticateRequest;
}
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
if(User.Identity.IsAuthenticated)
{
//Do stuff here
}
}