我遇到了并行调用WCF服务的问题。我正在尝试使用Tasks来并行调用两个服务以节省一些时间(我不是试图使这个异步),但我的任务是作为另一个用户运行的。这两种服务都需要Windows身份验证,并且两次调用都会失败,因为调用该服务的用户没有所需的权限。
调用代码(下面的代码)位于ASP.NET MVC4中的Controller Action内,运行IIS 7.5。涉及的所有应用程序池都设置为允许ASP.NET模拟并需要Windows身份验证(所有其他方法设置为禁用)。
// Parallel service request to two services
Task<object>[] tasks = new Task<object>[2];
// this shows my credentials, e.g. "MYDOMAIN\\MyUsername"
var userMe = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
tasks[0] = Task<object>.Factory.StartNew(() =>
{
// this shows "IIS APPPOOL\\DefaultAppPool"
var user = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
var data = client1.MyMethod();
return data;
});
tasks[1] = Task<object>.Factory.StartNew(() =>
{
// this shows "IIS APPPOOL\\DefaultAppPool"
var user = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
var data = client2.MyMethod();
return data;
});
Task.WaitAll(tasks);
我的问题:如何指示任务以当前用户身份运行,而不是作为“IIS APPPOOL \ DefaultAppPool”用户运行?
答案 0 :(得分:13)
试试这个:
WindowsIdentity impersonatedUser = WindowsIdentity.GetCurrent();
Task<object>.Factory.StartNew(() =>
{
using (WindowsImpersonationContext ctx = impersonatedUser.Impersonate())
{
//Your code
}
return data;
});
答案 1 :(得分:3)
您可能想要了解设置<alwaysFlowImpersonationContext>
是否合适:
指定Windows标识始终跨异步点流动,无论模拟的执行方式如何。
默认情况下,此设置在ASP.Net中是关闭的,因此任务(可能在其他线程上运行)最终运行时没有模拟。
否则(如果不适合设置),我认为你可以将WindowsIdentity
对象捕获到由Task
捕获的局部变量中,然后从任务中调用Impersonate()
。 (虽然我没试过这个)