Windows模拟和复制令牌

我有一个asp.net项目,请求将工作委托给后台(通过quartz.net)。 Web应用程序正在使用Windows身份validation和模拟。

我还想在后台线程上模拟当前用户。 我已经阅读了如何使用提供的域名,用户名和密码模拟用户并调用内核。 那种方法有效。

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

但我得到一个exception重叠I / O操作正在进行中

NativeMethod调用来自这篇文章: 如何将凭据传递给计算机,以便我可以使用Microsoft.Win32.RegistryKey.OpenRemoteBaseKey()?

是否可以使用当前用户的令牌并在后台线程上模拟该用户? 如果是这样,怎么办呢?是否需要用户访问权限?

不幸的是,你无法绕过“LogonUser”。 一种选择是使用ASP.NET Impersonation 。 如果用第一个块代码替换第二个代码块的前两行,则第二个已经拥有它。