39


AuthenticateRequest caso

Q 1. A mi entender FormsAuthenticationModule está suscrito a AuthenticateRequest caso, y por lo tanto sólo después de que se dispara este evento, es FormsAuthenticationModule llamada. Pero las siguientes citas me tiene un poco confundido:

  1. Los AuthenticateRequest evento indica que el mecanismo de autenticación configurado ha autenticado la solicitud actual.

    • ¿No dice la cita anterior sugieren que cuando se eleva AuthenticateRequest caso, la solicitud (alias de usuario) ya está autenticado?
  2. La suscripción al evento AuthenticateRequest asegura que la solicitud será autenticado antes de procesar el módulo o evento controlador asociado.

    • Por lo que yo entiendo esta cita, si nos suscribimos a AuthenticatedRequest, entonces nuestro gestor de eventos se llamará antes de FormsAuthenticationModule? Por lo tanto, se llamará Application_AuthenticateRequest() antes de llamar al FormsAuthenticationModule?


Q 2. libro que estoy aprendiendo de sugiere que dentro de Application_AuthenticateRequest() somos capaces de verificar si el usuario es un miembro de la función específica, y si no, podemos agregar el usuario de forma automática:

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 juzgar por el código anterior, Application_AuthenticateRequest() se llama después de FormsAuthenticationModule ha sido invocado, pero en otro lugar mismo libro implica que Application_AuthenticateRequest() se llama antes de FormsAuthenticationModule:

Application_AuthenticateRequest se llama justo antes de realizar la autenticación. Este es un punto de partida para crear su propia lógica de autenticación.


¿Qué me falta?


Gracias

Respuesta

50

Parece que el FormsAuthenticationModule se maneja en primer lugar. Este módulo es normalmente anterior a cualquier módulo personalizado en la interconexión ASP.NET, por lo que cuando se activa AuthenticateRequest, primero se llamará a FormsAuthenticationModule, se hará su trabajo y luego se llamará al controlador de eventos de su módulo.

Si realmente quiere profundizar en esto, le sugiero que intente depurar el código ASP.NET usted mismo.Aquí es un post cómo configurar su VS:

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

EDITAR: yo era capaz de confirmar este comportamiento mediante la creación de un proyecto web con módulos personalizados y controladores de eventos en Global.asax. Tome un vistazo al código fuente de HttpApplication.InitInternal, el orden de inicialización es el siguiente:

  • inicialización de módulos integrados: FormsAuthenticationModule se conecta a HttpApplication.AuthenticateRequest caso
  • inicialización de módulos personalizados: ganchos módulos personalizados hasta HttpApplication.AuthenticateRequest caso
  • inicialización de clase mundial (global.asax): aquí enganchar hasta el evento AuthenticateRequest
  • HttpApplication.InitInternal búsquedas de métodos de clase mundial siguiendo el patrón nombre específico (por ejemplo Application_AuthenticateRequest), Los partidos al evento y se engancha

Después de la inicialización, cuando se dispara el AuthenticateRequest, los controladores de eventos son llamados en el orden en que inicializan en donde, por lo que:

  • FormsAuthenticationModule.AuthenticateRequest controlador de eventos
  • CustomModule.AuthenticateRequest controlador de eventos
  • Global.AuthenticateRequest controlador de eventos método
  • Global.Application_AuthenticateRequest

A menos que me haya perdido algo, no existe un mecanismo para detener los controladores de eventos para disparar, por lo que no importa cuál sea el resultado de FormsAuthenticationModule.AuthenticateRequest, todavía se llamará los próximos manipuladores. Espero que eso ayude.

+0

Q1 Si he entendido bien, a continuación, cuando los incendios AuthenticateRequest, FormsAuthenticationModule se llama en primer lugar, a continuación, Application_AuthenticateRequest() y sólo entonces se se llaman módulos de autenticación personalizados? Q2 - ¿Pero qué pasa con esa cita de MSDN ("El evento AuthenticateRequest indica que el mecanismo de autenticación configurado ha autenticado la solicitud actual"), lo que implica que AuthenticateRequest se activa solo después de que FormsAuthenticationModule hace su trabajo? – SourceC

+1

Respuesta detallada en la publicación. En cuanto a Q2, supongo que no es del todo cierto: "El evento AuthenticateRequest indica que el mecanismo de autenticación configurado ha autenticado la solicitud actual", sin duda pasó por el controlador de eventos en FormsAuthenticationModule, pero no conocemos el resultado;) – bbmud

+1

thanx. Realmente me ayudaste con esta – SourceC

5

Si desea tener acceso al objeto de usuario, sugeriría que utilice

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

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