我们在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**/
}
}
在这两种方式中,我都没有获得凭据的异常,因此模拟似乎成功,但似乎并没有真正将凭据更改为模拟用户。