Событие AuthenticateRequest - PullRequest
       12

Событие AuthenticateRequest

40 голосов
/ 18 мая 2009


Q 1. Насколько я понимаю, FormsAuthenticationModule подписан на событие AuthenticateRequest и, следовательно, только после запуска этого события вызывается FormsAuthenticationModule. Но следующие цитаты меня немного смутили:

  1. Событие AuthenticateRequest сигнализирует о том, что настроенный механизм аутентификации аутентифицировал текущий запрос.

    • Разве вышеприведенная цитата не предполагает, что при возникновении события AuthenticateRequest запрос (он же пользователь) уже аутентифицирован?
  2. Подписка на событие AuthenticateRequest гарантирует, что запрос будет аутентифицирован перед обработкой подключенного модуля или обработчика события.

    • Насколько я понимаю эту цитату, если мы подпишемся на AuthenticatedRequest, то наш обработчик событий будет вызываться до FormsAuthenticationModule? Таким образом, Application_AuthenticateRequest() будет вызван до того, как FormsAuthenticationModule будет вызван?


Q 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 ]

51 голосов
/ 18 мая 2009

Кажется, что 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

РЕДАКТИРОВАТЬ : я смог подтвердить это поведение, настроив веб-проект с пользовательским модулем и обработчиками событий в 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 все равно будут вызываться следующие обработчики. Надеюсь, это поможет.

5 голосов
/ 20 февраля 2012

Если вы хотите получить доступ к объекту User, я рекомендую вам использовать

protected void Application_Start()
{
    PostAuthenticateRequest += Application_PostAuthenticateRequest;
}

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    if(User.Identity.IsAuthenticated)
    {
        //Do stuff here
    }
}
...