使用impersonate = true时如何在IIS中获取当前应用程序池用户?

时间:2010-04-30 01:05:30

标签: .net iis windows-integrated-auth

在.net中托管的网站如何获得网站运行的当前用户。即应用程序池用户而不是访问该站点的当前用户。

使用Windows集成和模拟。

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

4 个答案:

答案 0 :(得分:18)

要在托管代码中恢复为应用池用户,您可以执行以下操作:

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

答案 1 :(得分:2)

找到解决方案。

使用RevertToSelf,您可以从线程中剥离模拟。在IIS中,这等同于App Pool用户。

一些doco

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

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

代码

    [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;
    }

答案 2 :(得分:0)

如果您纯粹需要查看用户,那么您不能只使用Environment.UserName?

我只是将我的环境重新配置为使用经典应用程序池(启用了Impersonation),并且用户在IUSR上打开了Impersonate。

答案 3 :(得分:0)

约翰西蒙斯:正是我想要的,谢谢。 对于VB.net版本:

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