Événement AuthenticateRequest

Q 1. À ma connaissance, FormsAuthenticationModule est abonné à l’événement AuthenticateRequest et, par conséquent, FormsAuthenticationModule est appelé uniquement après le déclenchement de cet événement. Mais les citations suivantes m’ont un peu confus:

  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 (également appelée 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.

    • Pour autant que je comprenne cette citation, si nous nous abonnons à AuthenticatedRequest , notre gestionnaire d’événement sera appelé avant FormsAuthenticationModule ? Ainsi, Application_AuthenticateRequest() sera appelée avant l’appel de FormsAuthenticationModule ?

Q 2. Le livre que j’apprends suggère que dans Application_AuthenticateRequest() nous sums en mesure de vérifier si l’utilisateur est membre d’un rôle spécifique et, dans le cas contraire, nous pouvons append 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ée juste avant l’authentification. C’est un sharepoint départ pour créer votre propre logique d’authentification.

Qu’est-ce que je rate?

Merci

    Il semble que le FormsAuthenticationModule soit traité en premier. Ce module est normalement antérieur à tout module personnalisé dans le pipeline ASP.NET. Ainsi, lorsque AuthenticateRequest est déclenché, FormsAuthenticationModule sera appelé en premier, effectuera son travail, puis le gestionnaire d’événement de votre module sera appelé.

    Si vous voulez vraiment approfondir cette question, je vous suggère d’essayer de déboguer le code ASP.NET vous-même. Voici un post comment configurer votre VS:

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

    EDIT : J’ai pu confirmer ce comportement en configurant un projet Web avec des gestionnaires de module et d’événement personnalisés dans Global.asax. Regardez le code source de HttpApplication.InitInternal, l’ordre d’initialisation est le suivant:

    • initialisation des modules intégrés: FormsAuthenticationModule raccorde à l’événement HttpApplication.AuthenticateRequest
    • initialisation des 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 les méthodes sur la classe Global en suivant le modèle de nom spécifique (par exemple, Application_AuthenticateRequest), les fait correspondre à 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 dans lequel 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 quelque chose me manque, il n’y a pas de mécanisme pour arrêter les gestionnaires d’événements à déclencher, donc peu importe le résultat de FormsAuthenticationModule.AuthenticateRequest, les gestionnaires suivants seront toujours appelés. J’espère que ça aide.

    Si vous souhaitez accéder à l’object 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 } }