c# asp.net authentication forms-authentication httpapplication

c# - Evento AuthenticateRequest



asp.net authentication (2)


Q 1. A mi entender, FormsAuthenticationModule está suscrito al evento AuthenticateRequest y, por lo tanto, solo después de que se FormsAuthenticationModule este evento, se llama a FormsAuthenticationModule . Pero las siguientes citas me confundieron un poco:

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

    • ¿No sugiere la cita anterior que cuando se AuthenticateRequest evento AuthenticateRequest , la solicitud (también conocido como usuario) ya está autenticada?
  2. La suscripción al evento AuthenticateRequest garantiza que la solicitud se autenticará antes de procesar el módulo adjunto o el controlador de eventos.

    • Por lo que entiendo esta cita, si nos suscribimos a AuthenticatedRequest , nuestro controlador de eventos será llamado antes de FormsAuthenticationModule ? Por lo tanto, se FormsAuthenticationModule Application_AuthenticateRequest() antes de llamar a FormsAuthenticationModule ?


Q 2. El libro del que estoy aprendiendo sugiere que dentro de Application_AuthenticateRequest() podemos verificar si el usuario es miembro de un rol específico, y si no, podemos agregar al usuario automáticamente:

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, se llama a Application_AuthenticateRequest() después de FormsAuthenticationModule , pero en otro lugar el mismo libro implica que se llama a Application_AuthenticateRequest() antes de FormsAuthenticationModule :

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


¿Qué me estoy perdiendo?


Gracias


Parece que el FormsAuthenticationModule se maneja primero. 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í hay una publicación sobre cómo configurar su VS:

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

EDITAR : Pude confirmar este comportamiento configurando un proyecto web con módulo personalizado y controladores de eventos en Global.asax. Eche 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 al evento HttpApplication.AuthenticateRequest
  • inicialización de módulos personalizados: el módulo personalizado se conecta al evento HttpApplication.AuthenticateRequest
  • inicialización de clase Global (global.asax): aquí nos conectamos al evento AuthenticateRequest
  • HttpApplication.InitInternal busca métodos en la clase Global siguiendo el patrón de nombre específico (por ejemplo, Application_AuthenticateRequest), los relaciona con el evento y se conecta

Después de la inicialización, cuando se activa AuthenticateRequest, los controladores de eventos se invocan en el orden en que se inicializaron, por lo que:

  • Controlador de eventos FormsAuthenticationModule.AuthenticateRequest
  • Controlador de eventos CustomModule.AuthenticateRequest
  • Controlador de eventos Global.AuthenticateRequest
  • Método Global.Application_AuthenticateRequest

A menos que omita algo, no hay ningún mecanismo para detener el inicio de los manejadores de eventos, así que no importa cuál sea el resultado de FormsAuthenticationModule.AuthenticateRequest, los siguientes controladores serán llamados. Espero que eso ayude.


Si desea acceder al objeto Usuario, le sugiero que use

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