检查代码是否在WCF中的模拟Id下运行

时间:2013-11-26 21:55:34

标签: wcf iis-7 impersonation

我们在IIS中托管了一个WCF服务,该服务在“网络服务”下的“默认AppPool”下运行。帐户。在服务的某个时刻,需要从网络服务帐户无权访问的位置读取文件,因此我们需要使用管理员'帐户将该文件加载到内存中。

我已经尝试模拟来完成此操作,并且我的代码不会为我传入的管理员凭据抛出任何异常,并且我确信凭据是正确的。但即使在模仿之后,WindowsIdentity.GetCurrent().Name仍会显示NT Authority\Network Service。我正在使用许多人根据我的搜索使用的LogonUser Win32调用。我的web.config中没有任何模拟设置。

我的问题是WindowsIdentity.GetCurrent().Name是否是检查当时代码运行的凭据的正确方法。如果这是真的,那么我在这里做错了什么。

我尝试了两种不同的冒充方式: https://github.com/mj1856/SimpleImpersonation基本上是win32 LogonUser方法的包装器

我还尝试过原生添加代码,如下所示:

/** WindowsIdentity.GetCurrent().Name prints 'NT Authority\Network Service' **/
                    SafeTokenHandle safeTokenHandle;

                    const int logon32ProviderDefault = 0;
                    const int logon32LogonNewCredentials = 9;    // this logon type is required to allow cross-domain (WORKGROUP -> ourDomain) authentication

                    // Call LogonUser to obtain a handle to an access token.
                    bool logonSucceeded = LogonUser("user", "domain", "password", logon32LogonNewCredentials, logon32ProviderDefault, out safeTokenHandle);

                    if (!logonSucceeded)
                    {
                        int ret = Marshal.GetLastWin32Error();
                        throw new System.ComponentModel.Win32Exception(ret);
                    }

     using (safeTokenHandle)
                {
                    WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle());
                    using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
                    {
/** At this point, WindowsIdentity.GetCurrent().Name STILL says NT Authority\Network Service. Shouldn't it say domain\username passed in the call to LogonUser above**/
                    }
                }

在这两种方式中,我都没有获得凭据的异常,因此模拟似乎成功,但似乎并没有真正将凭据更改为模拟用户。

0 个答案:

没有答案