以排队的用户身份在其他进程中运行后台作业

时间:2016-11-15 14:18:10

标签: c# .net asp.net-web-api windows-authentication hangfire

在我们的应用程序中,我们要在后台运行Web API排队作业。我们使用HangFire进行作业的后台处理。 Web API使用Windows身份验证。 Hangfire服务器配置为作为Windows服务运行。

我正在尝试将后台作业作为排队的同一用户执行。

我尝试传递WindowsIdentity.GetCurrent()(序列化并通过hangfire传递)抛出的异常是“用于模仿的无效令牌 - 它无法复制”

[HttpGet, Route("enq")]
public IHttpActionResult EnQueue(string country)
{     
    var curUser = System.Security.Principal.WindowsIdentity.GetCurrent();           
    var id = Hangfire.BackgroundJob.Enqueue(() => Services.Common.TestClass.Test(curUser , country));
    return Ok(id);
}

遇到了一个叫WIN32 API method Logon user的方法。但由于这需要密码作为输入,不知道如何使用它。

以任何方式将后台作业作为排队的同一用户执行?

1 个答案:

答案 0 :(得分:0)

可能的解决方案:

  1. 使用Win32 API调用。缺点是,这种方法需要用户密码。更多详情请见下面的问题。
  2. Windows Impersonation and duplicating tokens

    1. 使用Kerberos Extension'服务进行用户登录'
    2. https://blogs.msdn.microsoft.com/winsdk/2015/08/28/logon-as-a-user-without-a-password/

      var upn = System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName;
      WindowsIdentity s4u = new WindowsIdentity(upn);