c# - 调用 Task.WaitAll() 时如何设置任务的用户身份?

标签 c# wcf iis task-parallel-library

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

调用代码(下面的代码)位于运行 IIS 7.5 的 ASP.NET MVC4 中的 Controller 操作内。所有涉及的应用程序池都设置为允许 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”用户身份运行?

最佳答案

试试这个:

WindowsIdentity impersonatedUser = WindowsIdentity.GetCurrent();

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

关于c# - 调用 Task.WaitAll() 时如何设置任务的用户身份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16149422/

相关文章:

asp.net - 如何在 IIS 上部署 ASP.NET Web,而无需创建单独的站点?

windows - 使用 MSDeploy 到运行默认 IIS 的 Windows 7 计算机

c# - 带复制粘贴的 ListView

c# - 外键与独立关系 - Entity Framework 5 有改进吗?

wcf - 如何强制WCF服务只使用一个线程?

json - WCF 不返回 JSON 数据或数据量大时出错

c# - 使用 StreamWriter 时进程无法访问文件

javascript - 按钮单击事件在弹出窗口中不起作用

c# - 使用 WCF 生成 JSON 数组

asp.net - 从虚拟机查看 ASP.net 开发服务器