Подтвердить что ты не робот

Событие 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

4b9b3361

Ответ 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
    }
}