如何调用Task.WaitAll()时,我设置任务的用户身份?(How do I set the u

2019-08-31 18:58发布

我在并行调用WCF服务的问题。 我试图使用任务并行调用两个服务,以节省一些时间(我并不想使这个异步),但我的任务正在运行的其他用户。 这两种服务都需要Windows认证和两个呼叫失败,因为用户调用该服务不具备所需的权限。

调用代码(代码下面)位于ASP.NET MVC4一个控制器动作内,运行。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 \默认应用”用户?

Answer 1:

试试这个:

WindowsIdentity impersonatedUser = WindowsIdentity.GetCurrent();

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


Answer 2:

你可能要考虑是否设置<alwaysFlowImpersonationContext>是合适的:

指定Windows身份始终是通过异步点流动,无论怎么进行模拟。

默认情况下,该设置是关闭的内ASP.Net,所以任务(运行,潜在的,对其他线程)结束了只是没有适当的模拟运行。

否则(如果它是不恰当的设置),我你可以捕捉到WindowsIdentity对象成年代由捕获一个局部变量Task s,然后打电话Impersonate()从任务中就可以了。 (虽然我没有试过)



文章来源: How do I set the user identity for tasks when calling Task.WaitAll()?