在与排队的用户不同的进程中运行后台作业
问题描述:
在我们的应用程序中,我们将Web API排队作业在后台运行。我们使用HangFire进行作业的后台处理。 Web API使用Windows身份验证。 Hangfire服务器被配置为作为Windows服务运行。在与排队的用户不同的进程中运行后台作业
我试图执行后台作业作为排队他们的同一个用户。
我试图通过WindowsIdentity.GetCurrent()(序列化和迟发型通过)抛出的异常是“为模拟令牌无效 - 它不能重复”
[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来了。但是,因为这需要密码作为输入不确定如何使用它。
任何方式来执行后台作业作为排队他们的同一个用户?
答
可能的解决方案:
- 使用Win32 API调用。缺点是,这种方法需要用户密码。在下面的更多细节SO问题。
Windows Impersonation and duplicating tokens
- 使用Kerberos扩展 '服务对于用户登录'
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);
甲'WindowsIdentity'对象引用的手柄,它是一个内核对象,因此不能被序列化。在作业排队时,Hangfire将不得不显式复制用户的令牌。 (我不知道它是否已经可以做到这一点,或者如果没有,那么添加会有多困难。) –
好的,谢谢@HarryJohnston! – Baga