我有一个asp.net项目,请求将工作委托给后台(通过quartz.net)。 Web应用程序正在使用Windows身份验证和模拟。
我还想在后台线程上模拟当前用户。我已经阅读了如何使用提供的域名,用户名和密码模拟用户并调用内核。该方法有效。
IntPtr token;
var successfullLogon = LogonUser(userName, password, domain, logonType, logonProvider, out token);
if(successfullLogon == false)
{
var errorCode = Marshal.GetHRForLastWin32Error();
Marshal.ThrowExceptionForHR(errorCode);
}
这有效,但它要求我提供特定的用户名/密码,或让用户输入他们的密码。这两种情况都不理想。
我想要的是将用户身份中的令牌从请求传递到后台,然后从该现有令牌模拟用户。我读过我应该可以调用DuplicateHandle,
var token = ((WindowsIdentity)Request.User.Identity).GetToken().ToInt64();
var token = new IntPrt(token from request);
IntPtr duplicate;
try
{
if(NaviteMethod.DuplicateToken(token, SecurityImpersonationLevel.Impersonate, out duplicate) == false)
{
var errorCode = Marshal.GetHRForLastWin32Error();
Marshal.ThrowExceptionForHR(errorCode);
}
using(var identity = new WindowsIdentity(duplicate))
using(var context = identity.Impersonate())
{
//do work
context.Undo();
}
}
finally
{
if(duplicate != IntPtr.Zero)
{
NaviteMethod.CloseHandler(duplicate);
}
}
但我得到一个异常正在进行重叠I / O操作
NativeMethod调用来自这篇文章:How do I pass credentials to a machine so I can use Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() on it?
是否可以使用当前用户的令牌并在后台线程上模拟该用户?如果是这样,怎么办呢?是否需要用户访问权限?
答案 0 :(得分:1)
很遗憾,您无法绕过“LogonUser”。一种选择是使用ASP.NET Impersonation。如果用第一个块代码替换第二个代码块的前两行,则第二个已经拥有它。