Evento AuthenticateRequest

P 1. A meu ver, FormsAuthenticationModule está inscrito no evento AuthenticateRequest e, portanto, somente após esse evento ser triggersdo, o FormsAuthenticationModule é chamado. Mas as citações seguintes me deixaram um pouco confuso:

  1. O evento AuthenticateRequest sinaliza que o mecanismo de autenticação configurado autenticou a solicitação atual.

    • A citação acima não sugere que, quando o evento AuthenticateRequest é gerado, a solicitação (também conhecido como usuário) já está autenticada?
  2. Assinar o evento AuthenticateRequest garante que a solicitação seja autenticada antes de processar o módulo anexado ou o manipulador de events.

    • Tanto quanto eu entendo esta citação, se subscrevermos AuthenticatedRequest , então o nosso manipulador de events será chamado antes de FormsAuthenticationModule ? Assim Application_AuthenticateRequest() será chamado antes de FormsAuthenticationModule ser chamado?

Q 2. O livro que estou aprendendo sugere que, em Application_AuthenticateRequest() podemos verificar se o usuário é um membro de uma function específica e, caso contrário, podemos adicionar o usuário automaticamente:

  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() } } 

A julgar pelo código acima, Application_AuthenticateRequest() é chamado depois que FormsAuthenticationModule foi invocado, mas em outro lugar o mesmo livro implica que Application_AuthenticateRequest() é chamado antes de FormsAuthenticationModule :

Application_AuthenticateRequest é chamado pouco antes de a autenticação ser executada. Este é um ponto de partida para criar sua própria lógica de autenticação.

o que estou perdendo?

Thanx

Parece que o FormsAuthenticationModule é tratado primeiro. Este módulo é normalmente anterior a qualquer módulo personalizado no pipeline do ASP.NET, portanto, quando o AuthenticateRequest for acionado, o FormsAuthenticationModule será chamado primeiro, fará seu trabalho e, em seguida, o manipulador de events do seu módulo será chamado.

Se você realmente quer aprofundar isso, sugiro tentar depurar o código ASP.NET você mesmo. Aqui está um post sobre como configurar seu VS:

http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx

EDIT : eu era capaz de confirmar esse comportamento através da criação de um projeto web com módulo personalizado e manipuladores de events no Global.asax. Dê uma olhada no código-fonte do HttpApplication.InitInternal, a ordem de boot é a seguinte:

  • boot de módulos integrados: FormsAuthenticationModule conecta-se ao evento HttpApplication.AuthenticateRequest
  • boot de módulos personalizados: o módulo personalizado conecta-se ao evento HttpApplication.AuthenticateRequest
  • boot da class Global (global.asax): aqui nós conectamos o evento AuthenticateRequest
  • HttpApplication.InitInternal procura por methods na class Global seguindo o padrão de nome específico (por exemplo, Application_AuthenticateRequest), combina-os com o evento e conecta-se

Após a boot, quando o AuthenticateRequest é acionado, os manipuladores de events são chamados na ordem em que foram inicializados, portanto:

  • Manipulador de events FormsAuthenticationModule.AuthenticateRequest
  • Manipulador de events CustomModule.AuthenticateRequest
  • Manipulador de events Global.AuthenticateRequest
  • Método Global.Application_AuthenticateRequest

A menos que eu tenha perdido algo, não há nenhum mecanismo para interromper o tratamento dos manipuladores de events, portanto, não importa qual seja o resultado de FormsAuthenticationModule.AuthenticateRequest, os próximos manipuladores ainda serão chamados. Espero que isso ajude.

Se você quiser acessar o object Usuário, sugiro que use

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