WindowsIdentity.Impersonate dans ASP.NET de manière aléatoire "Jeton non valide pour l'usurpation d'identité - il ne peut pas être dupliqué"

StackOverflow https://stackoverflow.com/questions/8993293

Question

J'ai une application ASP.NET qui oblige les utilisateurs à se connecter avec leurs comptes de domaine à l'aide de l'authentification de base.L'utilisateur peut faire une sélection, puis appuyer sur un bouton.

À un moment donné, après avoir appuyé sur le bouton, ce code apparaît : WindowsIdentity.Impersonate(userIdentity.Token). identitéutilisateur est du type Identité Windows, et il était auparavant défini sur (WindowsIdentity)User.Identity.

identitéutilisateur est stocké en tant que variable de session, et je pense que c'est parce que, après avoir appuyé sur le bouton, la page contenant ce code est appelée via AJAX.

Lorsque j'appuie sur ce code, cela fonctionne environ 2/3 du temps, mais 1/3 du temps, j'obtiens cette exception : Jeton non valide pour l'usurpation d'identité : il ne peut pas être dupliqué. Je pense que le plus gros problème pour moi est de savoir pourquoi cela fonctionne-t-il parfois mais pas d'autres fois ?Sur certaines sessions, cela fonctionne plusieurs fois avant d'échouer.Sur d’autres, cela échoue tout de suite.

Voici la trace de la pile :

à System.Security.Principal.WindowsIdentity.CreateFromToken (IntPtr userToken)

sur System.Security.Principal.WindowsIdentity..ctor (IntPtr userToken, String authType, Int32 isAuthenticated)

à System.Security.Principal.WindowsIdentity.Impersonate (IntPtr userToken)

à Resource_Booker.BLL.ReservationAgent.SubmitReservationRequest (Réservation de réservation, Patron patron) dans C:\dev oomRes esource Booker\BLL eservationAgent.cs:line 101

à Resource_Booker.Reserve.reserve_Click (Expéditeur d'objet, EventArgs e) dans C:\dev oomRes esource Booker eserve.aspx.cs:line 474

à System.EventHandler.Invoke (expéditeur d'objet, EventArgs e)

sur System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument)

sur System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Voici un facteur de confusion :Je ne peux pas reproduire ce problème sur mon poste de travail Windows 7 x64 local (bien que mon authentification soit transmise implicitement ici puisque j'utilise localhost) ou sur un environnement Windows 2003 32 bits IIS 6.0.Cela ne se produit que sur un joli environnement Windows 2008 R2 vanille.Tous ces environnements sont membres du domaine.

Était-ce utile?

La solution

Fondamentalement, ce que vous voyez n'est pas un problème de sécurité car la session de connexion est mise en cache par IIS pendant toute la durée de vie de la connexion TCP, mais HTTP coupera occasionnellement la connexion TCP nécessitant une ré-authentification.Cela se produira de manière transparente et invisible (géré par le navigateur), mais cela invalidera le jeton, car la session de connexion sera détruite à la fin de la connexion TCP.

C'est à dire.pour le bénéfice de @usr, cela ne fonctionne que parfois parce que la session de connexion est la même, donc le jeton est le même, donc le jeton stocké dans la session fonctionne car il se trouve qu'il s'agit du même jeton que User.Identity.Ce n'est pas un moyen d'éviter le contrôle de sécurité, c'est un détail de mise en œuvre du contrôle de sécurité.

Vous ne devriez pas stocker l'identité dans la session - c'est inutile puisqu'il s'agit d'une connexion authentifiée.

Utilisez simplement (WindowsIdentity)User.Identity à chaque fois et votre problème devrait disparaître.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top