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é:
L'événement
AuthenticateRequest
signale que le mécanisme d'authentification configuré a authentifié la demande en cours.
AuthenticateRequest
est déclenché, la demande (alias 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
, 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
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:
[~ # ~] 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:
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:
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.
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
}
}