Событие AuthenticateRequest


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

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

    • Разве приведенная выше цитата не предполагает, что когда AuthenticateRequest событие инициировано, запрос (он же пользователь) уже аутентифицирован?
  2. Подписка на 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:

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 все равно будут вызываться следующие обработчики. Надеюсь, это поможет.

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

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

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    if(User.Identity.IsAuthenticated)
    {
        //Do stuff here
    }
}
Другие вопросы по тегам