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

Val*_*mar 8 c# iis wcf task-parallel-library

我遇到了并行调用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);
Run Code Online (Sandbox Code Playgroud)

我的问题:如何指示任务作为当前用户运行,而不是作为"IIS APPPOOL\DefaultAppPool"用户运行?

Vya*_*kov 13

试试这个:

WindowsIdentity impersonatedUser = WindowsIdentity.GetCurrent();

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