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:
L’événement
AuthenticateRequest
signale que le mécanisme d’authentification configuré a authentifié la demande en cours.
AuthenticateRequest
est déclenché, la demande (également appelée utilisateur) est déjà authentifiée? 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.
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:
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:
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:
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 } }