2010-04-30 19 views
8

En .NET cuando un sitio web alojado en IIS obtiene el usuario actual bajo el que se ejecuta el sitio web. es decir, el usuario del grupo de aplicaciones no es el usuario actual que accede al sitio.¿Cómo obtener el usuario del grupo de aplicaciones actual en IIS cuando se usa impersonate = true?

Uso de ventanas integradas y suplantación.

<authentication mode="Windows"/> 
<identity impersonate="true"/> 
+0

para qué? Tal vez su esquema de suplantación no es el correcto si necesita obtener algunas acciones para el usuario del grupo de aplicaciones. –

Respuesta

18

Para volver al usuario grupo de aplicación en código administrado, puede hacer lo siguiente:

using (WindowsIdentity.Impersonate(IntPtr.Zero)) 
{ 
    //This code executes under app pool user 
} 
+0

[Enlace rápido] (https://msdn.microsoft.com/en-us/library/chf6fbt4 (v = vs.110) .aspx # remarksToggle) a la documentación relevante. –

0

Si simplemente necesita ver al usuario, ¿no podría usar Environment.UserName?

Acabo de reconfigurar mi entorno para ejecutar con un grupo de aplicaciones Classic (con personificación activada) y el usuario aparece como IUSR con Impersonate on.

+0

En realidad quiero la WindowsIdentity no el nombre de usuario – Simon

2

Encontré una solución.

Usando RevertToSelf puede quitar la suplantación de un hilo. En IIS, esto equivale al usuario del grupo de aplicaciones.

Algunos mana

http://www.pinvoke.net/default.aspx/advapi32.reverttoself

http://msdn.microsoft.com/en-us/library/aa379317%28VS.85%29.aspx

Y el código

[DllImport("advapi32.dll", SetLastError = true)] 
    static extern bool RevertToSelf(); 

    private static WindowsIdentity GetAppPoolIdentity() 
    { 
     WindowsIdentity identity = null; 
     Win32Exception win32Exception = null; 
     var thread = new Thread(o => 
         { 
          if (!RevertToSelf()) 
          { 
           var win32error = Marshal.GetLastWin32Error(); 
           win32Exception = new Win32Exception(win32error); 
          } 

          identity = WindowsIdentity.GetCurrent(); 
         }); 
     thread.Start(); 
     thread.Join(); 
     if (win32Exception != null) 
     { 
      throw win32Exception; 
     } 
     return identity; 
    } 
+0

Quizás use ** 'this.Request.LogonUserIdentity.Name' ** – Kiquenet

0

John Simons: Exactamente lo que quería, gracias. Para la versión de VB.net:

With System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero) 
    Dim sCurrentUserName As String = System.Security.Principal.WindowsIdentity.GetCurrent.Name 
End With 
Cuestiones relacionadas