Windows模拟和复制令牌

Jas*_*ley 5 c# asp.net impersonation

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

这可行,但它要求我提供特定的用户名/密码,或让用户输入他们的密码.这两种情况都不理想.

我想要的是将令牌从用户的身份从请求传递到后台,然后从这个现有令牌模拟用户.我读到我应该可以调用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 1

不幸的是,您无法绕过“LogonUser”。一种选择是使用ASP.NET 模拟。如果您用第一个代码块替换第二个代码块的前两行,那么您已经拥有了第二个代码块。