web-dev-qa-db-fra.com

Événement AuthenticateRequest


Q 1. À ma connaissance, FormsAuthenticationModule est abonné à l'événement AuthenticateRequest, et donc seulement après le déclenchement de cet événement, FormsAuthenticationModule est appelé. Mais les citations suivantes m'ont un peu dérouté:

  1. L'événement AuthenticateRequest signale que le mécanisme d'authentification configuré a authentifié la demande en cours.

    • La citation ci-dessus ne suggère-t-elle pas que lorsque l'événement AuthenticateRequest est déclenché, la demande (alias utilisateur) est déjà authentifiée?
  2. L'abonnement à l'événement AuthenticateRequest garantit que la demande sera authentifiée avant de traiter le module attaché ou le gestionnaire d'événements.

    • Si je comprends bien cette citation, si nous nous abonnons à AuthenticatedRequest, alors notre gestionnaire d'événements sera appelé avant FormsAuthenticationModule? Ainsi Application_AuthenticateRequest() sera appelé avant l'appel de FormsAuthenticationModule?


Q 2. Le livre que j'apprends suggère que dans Application_AuthenticateRequest() nous sommes en mesure de vérifier si l'utilisateur est membre d'un rôle spécifique, et sinon, nous pouvons ajouter l'utilisateur automatiquement:

    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 en juger par le code ci-dessus, Application_AuthenticateRequest() est appelée après l'appel de FormsAuthenticationModule, mais ailleurs, le même livre implique que Application_AuthenticateRequest() est appelée avant FormsAuthenticationModule :

Application_AuthenticateRequest Est appelé juste avant que l'authentification ne soit effectuée. Il s'agit d'un point de départ pour créer votre propre logique d'authentification.


Qu'est-ce que je rate?


Thanx

40
SourceC

Il semble que le FormsAuthenticationModule soit traité en premier. Ce module est normalement plus tôt que n'importe quel module personnalisé dans le pipeline ASP.NET, donc lorsque AuthenticateRequest est déclenché, FormsAuthenticationModule sera appelé en premier, fera son travail, puis le gestionnaire d'événements de votre module sera appelé.

Si vous voulez vraiment approfondir cela, je vous suggère d'essayer de déboguer le code ASP.NET vous-même. Voici un article sur la configuration de votre VS:

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

[~ # ~] modifier [~ # ~] : j'ai pu confirmer ce comportement en configurant un projet Web avec des modules personnalisés et des gestionnaires d'événements dans Global.asax. Jetez un œil au code source de HttpApplication.InitInternal, l'ordre d'initialisation est le suivant:

  • initialisation des modules intégrés: FormsAuthenticationModule se connecte à l'événement HttpApplication.AuthenticateRequest
  • initialisation de modules personnalisés: le module personnalisé se connecte à l'événement HttpApplication.AuthenticateRequest
  • initialisation de la classe Global (global.asax): ici nous nous connectons à l'événement AuthenticateRequest
  • HttpApplication.InitInternal recherche des méthodes sur la classe Global en suivant le modèle de nom spécifique (par exemple Application_AuthenticateRequest), les compare à l'événement et se connecte

Après l'initialisation, lorsque AuthenticateRequest se déclenche, les gestionnaires d'événements sont appelés dans l'ordre où ils ont été initialisés, donc:

  • Gestionnaire d'événements FormsAuthenticationModule.AuthenticateRequest
  • Gestionnaire d'événements CustomModule.AuthenticateRequest
  • Gestionnaire d'événements Global.AuthenticateRequest
  • Méthode Global.Application_AuthenticateRequest

Sauf si j'ai raté quelque chose, il n'y a aucun mécanisme pour arrêter le déclenchement des gestionnaires d'événements, donc quel que soit le résultat de FormsAuthenticationModule.AuthenticateRequest, les prochains gestionnaires seront toujours appelés. J'espère que ça aide.

51
bbmud

Si vous souhaitez accéder à l'objet Utilisateur, je vous suggère d'utiliser

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

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