我使用HostingEnvironment.QueueBackgroundWorkItem
在ASP.Net应用程序的后台运行工作,基于Scott Hanselman的博客文章How to run Background Tasks in ASP.NET。
我想将后台任务作为当前用户的身份运行。我尝试在操作中传递WindowsPrincipal并设置Thread.CurrentPrincipal,但这并没有导致Action作为当前用户执行。
这是可能的,还是使用HostingEnvironment总是暗示作为应用程序池标识运行?
修改
不完全符合我的原始问题,但我也试图通过CallContext.LogicalSetData()和CallContext.LogicalGetData()传递一个值。在Get侧,值始终为null。
编辑#2
也在排队方面尝试了这个:
using (HostingEnvironment.Impersonate(windowsIdentity.Token))
{
HostingEnvironment.QueueBackgroundWorkItem(work);
}
当工作完成后,Action中的当前WindowsIdentity仍然是应用程序池标识。
答案 0 :(得分:0)
为什么你必须"使用" HostingEnvironment" ?
或您是否尝试过使用WindowsImpersonationContext?
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext =
((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
//Insert your code that runs under the security context of the authenticating user here.
impersonationContext.Undo();
您可以了解更多如何操作here
答案 1 :(得分:0)
当前用户的标识附加到处理请求的线程,并且仅在该请求的生命周期内有效。即使您将HttpContext.Current.User.Identity
的引用传递给您的工作函数,您也会发现它在您尝试使用它时可能不再有效。据我所知,您需要使用Windows API进行一些工作来克隆身份令牌以创建新的WindowsIdentity
,然后您可以在后台任务中使用它。所以像这样:
IntPtr copy = IntPtr.Zero,
token = ((WindowsIdentity)HttpContext.Current.User.Identity).Token;
if (DuplicateToken(token, ref copy)) // the WinAPI function has more parameters, this is a hypothetical wrapper
{
return new WindowsIdentity(copy);
}
// handle failure
将此WindowsIdentity
传递给您的后台任务,并在需要时模拟它。不要忘记丢弃它。