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.

Ce problème pourrait me faire peur, car il ressemble à un handle non valide a été utilisé en interne par le .NET Framework. C'est potentiellement de sécurité critiques.

OriginalL'auteur Aren Cambre | 2012-01-24