2012-01-24 15 views
7

Tengo una aplicación ASP.NET que requiere que los usuarios inicien sesión con sus cuentas de dominio mediante la Autenticación básica. El usuario puede hacer una selección, luego presionar un botón.WindowsIdentity.Impersonate en ASP.NET aleatoriamente "Token no válido para la suplantación: no se puede duplicar"

En algún momento después de presionar el botón se encuentra este código: WindowsIdentity.Impersonate(userIdentity.Token). userIdentity es del tipo WindowsIdentity, y se estableció previamente en (WindowsIdentity) User.Identity.

UserIdentity se almacena como una variable de sesión, y yo creo que es porque, después de pulsar el botón, la página que contiene el código se llama a través de AJAX.

Cuando pulso este código, funciona aproximadamente 2/3 del tiempo, pero 1/3 del tiempo, obtengo esta excepción: Token no válido para la suplantación: no se puede duplicar. Creo que el rascador de cabeza más grande para mí es ¿por qué funciona a veces pero no en otros? En algunas sesiones, funciona varias veces antes de fallar. En otros, falla de inmediato.

Aquí está el seguimiento de la pila:

en System.Security.Principal.WindowsIdentity.CreateFromToken (IntPtr UserToken)

en System.Security.Principal.WindowsIdentity..ctor (IntPtr UserToken, Cadena authType , Int32 isAuthenticated)

en System.Security.Principal.WindowsIdentity.Impersonate (IntPtr UserToken)

en Resource_Booker.BLL.ReservationAgent.Submit ReservationRequest (reserva de reserva, usuario del patrón) en C: \ dev \ RoomRes \ Resource Booker \ BLL \ ReservationAgent.cs: línea 101

en Resource_Booker.Reserve.reserve_Click (Object sender, EventArgs e) en C: \ dev \ RoomRes \ Resource Booker \ Reserve.aspx.cs: línea 474

en System.EventHandler.Invoke (Object sender, EventArgs e)

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

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

Aquí es un factor de confusión: No puedo reproducir este problema en mi estación de trabajo de Windows 7 x64 locales - aunque mi autenticación se pasa implícitamente aquí desde que estoy usando localhost - o en un Windows 2003 de 32 bits de IIS 6.0 entorno . Solo ocurre en un entorno muy simple de Windows 2008 R2. Todos estos entornos son miembros del dominio.

+0

Este problema me daría miedo porque parece que un identificador no válido fue utilizado internamente por .NET Framework. Esto es potencialmente crítico para la seguridad. – usr

Respuesta

8

Básicamente lo que está viendo no es un problema de seguridad ya que IIS almacena la sesión de inicio de sesión durante la vida de la conexión TCP, pero HTTP cortará ocasionalmente la conexión TCP que requiere una nueva autenticación. Esto sucederá de manera transparente e invisible (manejado por el navegador) pero invalidará el token, ya que la sesión de inicio de sesión se destruirá cuando finalice la conexión TCP.

I.e.para el beneficio de @usr, solo funciona a veces porque la sesión de inicio de sesión es la misma, por lo que el token es el mismo, por lo que el token almacenado en la sesión funciona porque es el mismo token real que User.Identity. No es una forma de evitar el control de seguridad, es un detalle de implementación del control de seguridad.

No debe almacenar la identidad en la sesión; no es necesario porque es una conexión autenticada.

Simplemente use (WindowsIdentity)User.Identity cada vez y su problema desaparecerá.

+1

Ese parece ser el problema. Para una solución rápida, encontré donde ** userIdentity ** se sacaba de la variable de sesión y forcé al programa a volver a crear una instancia. ¡Gracias! –

+0

@Ben: Gracias por la muy buena explicación. Me pregunto si (WindowsIdentity) User.Identity funcionará con la autenticación de Windows y manyToOneCertificateMapping está habilitado. No lo creo, desafortunadamente no puedo probar esto ahora mismo. – Kr15

+0

@ Kr15, si el usuario se autentica correctamente con la Autenticación de Windows, entonces '(WindowsIdentity) User.Identity' funcionará. – Ben

Cuestiones relacionadas