Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用Task.WaitAll()时,如何设置任务的用户标识?_C#_Wcf_Iis_Task Parallel Library - Fatal编程技术网

C# 调用Task.WaitAll()时,如何设置任务的用户标识?

C# 调用Task.WaitAll()时,如何设置任务的用户标识?,c#,wcf,iis,task-parallel-library,C#,Wcf,Iis,Task Parallel Library,我在并行调用WCF服务时遇到问题。我尝试使用任务并行调用两个服务以节省时间(我不尝试使其异步),但我的任务正在作为另一个用户运行。两个服务都需要Windows身份验证,并且两个调用都失败,因为调用该服务的用户没有所需的权限 调用代码(下面的代码)位于ASP.NET MVC4中运行IIS 7.5的控制器操作中。所有涉及的应用程序池都设置为允许ASP.NET模拟并要求Windows身份验证(所有其他方法都设置为禁用) //对两个服务的并行服务请求 任务[]任务=新任务[2]; //这将显示我的凭据,

我在并行调用WCF服务时遇到问题。我尝试使用任务并行调用两个服务以节省时间(我不尝试使其异步),但我的任务正在作为另一个用户运行。两个服务都需要Windows身份验证,并且两个调用都失败,因为调用该服务的用户没有所需的权限

调用代码(下面的代码)位于ASP.NET MVC4中运行IIS 7.5的控制器操作中。所有涉及的应用程序池都设置为允许ASP.NET模拟并要求Windows身份验证(所有其他方法都设置为禁用)

//对两个服务的并行服务请求
任务[]任务=新任务[2];
//这将显示我的凭据,例如“MYDOMAIN\\MyUsername”
var userMe=System.Security.Principal.WindowsIdentity.GetCurrent().Name;
任务[0]=Task.Factory.StartNew(()=>
{
//这显示“IIS APPPOOL\\DefaultAppPool”
var user=System.Security.Principal.WindowsIdentity.GetCurrent().Name;
var data=client1.MyMethod();
返回数据;
});
tasks[1]=Task.Factory.StartNew(()=>
{
//这显示“IIS APPPOOL\\DefaultAppPool”
var user=System.Security.Principal.WindowsIdentity.GetCurrent().Name;
var data=client2.MyMethod();
返回数据;
});
Task.WaitAll(任务);

我的问题:如何指示任务以当前用户的身份运行,而不是以“IIS APPPOOL\DefaultAppPool”用户的身份运行?

您可能需要查看设置是否合适:

指定无论如何执行模拟,Windows标识始终在异步点之间流动

默认情况下,此设置在ASP.Net中处于禁用状态,因此任务(可能在其他线程上运行)最终只是在没有模拟的情况下运行

否则(如果设置不合适),我认为您可以将
WindowsIdentity
对象捕获到由
任务
捕获的局部变量中,然后在任务中调用它。(虽然我还没有试过这个)

试一下:

WindowsIdentity impersonatedUser = WindowsIdentity.GetCurrent();

Task<object>.Factory.StartNew(() =>
{
    using (WindowsImpersonationContext ctx = impersonatedUser.Impersonate())
    {
       //Your code
    }
    return data;
});
WindowsIdentity模拟用户=WindowsIdentity.GetCurrent();
Task.Factory.StartNew(()=>
{
使用(WindowsImpersonationContext ctx=impersonatedUser.Impersonate())
{
//你的代码
}
返回数据;
});

IIS运行的大多数服务代码都有专门的用户帐户。有什么理由打破沙箱以另一个用户的身份运行它吗?Jasper:我调用的服务既使用Kerberos/Windows身份验证,又要求客户端经过身份验证和授权(通过AD角色)才能使用它。这就是为什么我必须使用正确的凭据调用它们。我将在明天的工作中尝试alwaysFlowImpersonationPolicy,这似乎是我正在寻找的解决方案。似乎我需要在aspnet.config文件中添加alwaysFlowImpersonationPolicy元素,该文件对整个服务器是全局的,所以这不是一个选项。alwaysFlowImpersonationContext现在可以为每个应用程序池配置这是我最终使用的解决方案。有点开销,但能完成任务。
WindowsIdentity impersonatedUser = WindowsIdentity.GetCurrent();

Task<object>.Factory.StartNew(() =>
{
    using (WindowsImpersonationContext ctx = impersonatedUser.Impersonate())
    {
       //Your code
    }
    return data;
});