WindowsIdentity.Usurper l'identité dans ASP.NET au hasard “Invalid token pour usurpation d'identité, qui ne peut pas être dupliqué”
J'ai un ASP.NET app 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 appuyez sur un bouton.
À un certain point, après avoir appuyé sur le bouton, c'est ce code: WindowsIdentity.Impersonate(userIdentity.Token)
. userIdentity est de type WindowsIdentity, et il a déjà été mis à (WindowsIdentity)de l'Utilisateur.L'identité.
userIdentity est stocké dans une variable de session, et je pense que c'est parce que, après que le bouton est pressé, la page contenant ce code est appelé via AJAX.
Lorsque je tape ce code, il fonctionne environ les 2/3 du temps, mais 1/3 du temps, j'ai cette exception: Invalide jeton d'emprunt d'identité, il ne peut pas être dupliqué. Je pense que le plus grand gratte la tête pour moi, c'est pourquoi ça fonctionne parfois, mais pas à d'autres moments? Sur certaines séances, il travaille à plusieurs reprises avant d'échouer. Sur d'autres, il ne parvient pas tout de suite.
Voici la trace de la pile:
au Système.De sécurité.Principal.WindowsIdentity.CreateFromToken(IntPtr userToken)
au Système.De sécurité.Principal.WindowsIdentity..ctor(IntPtr userToken, Chaîne authType, Int32 isAuthenticated)
au Système.De sécurité.Principal.WindowsIdentity.Usurper l'identité(IntPtr userToken)
à Resource_Booker.BLL.ReservationAgent.SubmitReservationRequest(Réservation la réservation, Patron patron) C:\dev\RoomRes\Resource Booker\BLL\ReservationAgent.cs:ligne 101
à Resource_Booker.La réserve.reserve_Click(Object sender, EventArgs e) dans C:\dev\RoomRes\Resource Booker\Réserve.aspx.cs:ligne 474
au Système.Gestionnaire d'événements.Invoke(Object sender, EventArgs e)
au Système.Web.L'INTERFACE utilisateur.Contrôles webcontrols.Bouton.RaisePostBackEvent(String eventArgument)
au Système.Web.L'INTERFACE utilisateur.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Ici est un facteur de confusion: je ne peux pas reproduire ce problème sur mon Windows 7 x64 poste de travail--quoique mon authentification est passé implicitement ici depuis que je suis en utilisant localhost--ou sur un Windows 2003 32-bit IIS 6.0 environnement. Il ne se produit que sur un joli vanille Windows 2008 R2 environnement. Tous ces milieux sont les membres du domaine.
OriginalL'auteur Aren Cambre | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, ce que vous voyez n'est pas un problème de sécurité que l'ouverture de session est mis en cache par le serveur IIS pour la durée de vie de la connexion TCP, mais HTTP sera de temps en temps couper la connexion TCP nécessitant une authentification. Cela se fera de manière transparente et invisible (gérées par le navigateur), mais elle invalide le jeton, comme l'ouverture de session session sera détruite lors de la connexion TCP se termine.
I. e. pour le bénéfice de @usr, il ne fonctionne que parfois parce que la session de connexion est le même si le jeton est le même, donc le jeton stockées dans la session fonctionne parce qu'il se trouve être la même jeton que de l'Utilisateur.L'identité. Ce n'est pas un moyen d'éviter la vérification de la sécurité c'est un détail d'implémentation du contrôle de sécurité.
Vous ne devriez pas enregistrer l'identité de la session, il est inutile étant donné que c'est une connexion authentifiée.
Suffit d'utiliser
(WindowsIdentity)User.Identity
tous les temps et de votre problème devrait disparaître.Merci pour la très bonne explication. Je suis à me demander si (WindowsIdentity)de l'Utilisateur.Identité de travailler avec l'authentification windows et manyToOneCertificateMapping activé? Je ne pense pas, malheureusement je ne peux pas tester ce droit maintenant.
Si l'utilisateur est authentifié avec succès avec l'Authentification Windows, puis
(WindowsIdentity)User.Identity
fonctionne.OriginalL'auteur Ben