2010-04-30 4 views
8

In .net, wenn eine Website in IIS gehostet wird, wie erhalten Sie den aktuellen Benutzer, unter dem die Website ausgeführt wird. dh der Benutzer des Anwendungspools ist nicht der aktuelle Benutzer, der auf die Site zugreift.Wie bekomme ich den aktuellen Anwendungspoolbenutzer in IIS, wenn ich impersonate = true verwende?

Verwenden von Windows integriert und imitieren.

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

wofür? Möglicherweise ist Ihr Identitätswechselschema nicht korrekt, wenn Sie den App-Pool-Benutzer für bestimmte Aktionen benötigen. –

Antwort

18

zum app-Pool Benutzer in verwalteten Code wiederherstellen Sie Folgendes tun können:

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

[Quick-Link] (https://msdn.microsoft.com/en-us/library/chf6fbt4 (v = vs.110) .aspx # notesToggle) zur relevanten Dokumentation. –

0

Wenn Sie nur den Benutzer sehen müssen, können Sie nicht einfach Environment.UserName verwenden?

Ich habe gerade meine Umgebung neu konfiguriert, um mit einem Classic App-Pool (mit Identitätswechsel an) zu laufen, und der Benutzer kommt als IUSR mit Impersonate auf.

+0

Ich möchte eigentlich die WindowsIdentity nicht den Benutzernamen – Simon

2

Eine Lösung gefunden.

Mit RevertToSelf können Sie den Identitätswechsel aus einem Thread entfernen. In IIS entspricht dies dem Benutzer des App-Pools.

Einige doco

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

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

Und der Code

[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

Vielleicht verwenden Sie ** 'this.Request.LogonUserIdentity.Name' ** – Kiquenet

0

John Simons: Genau das, was ich wollte, Danke. Für VB.net Version:

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