【问题标题】:How do I set the user identity for tasks when calling Task.WaitAll()?调用 Task.WaitAll() 时如何设置任务的用户身份?
【发布时间】:2013-04-15 11:47:40
【问题描述】:

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

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

【问题讨论】:

  • IIS 运行的大部分服务代码都使用特殊的用户帐户。有什么理由打破沙盒以其他用户身份运行它?它不是文件访问功能...
  • Jasper:我调用的服务都使用 Kerberos/Windows 身份验证,并要求客户端经过身份验证和授权(通过 AD 角色)才能使用它。这就是为什么我必须使用正确的凭据调用它们。

标签: c# wcf iis task-parallel-library


【解决方案1】:

您可能想看看设置&lt;alwaysFlowImpersonationContext&gt; 是否合适:

指定 Windows 标识始终跨异步点流动,无论模拟是如何执行的。

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

否则(如果不适合设置),我认为您可以将WindowsIdentity 对象捕获到由Tasks 捕获的局部变量中,然后调用Impersonate()从任务中就可以了。 (虽然我没试过)

【讨论】:

  • 明天我会在工作中尝试 alwaysFlowImpersonationPolicy,这似乎是我正在寻找的解决方案。
  • 看来我需要在 aspnet.config 文件中添加 alwaysFlowImpersonationPolicy 元素,该元素对整个服务器都是全局的,所以这不是一个选项。
  • alwaysFlowImpersonationContext 现在可以为每个应用程序池配置weblogs.asp.net/owscott/…
【解决方案2】:

试试这个:

WindowsIdentity impersonatedUser = WindowsIdentity.GetCurrent();

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

【讨论】:

  • 这是我最终使用的解决方案。有点开销,但确实可以。
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 2019-11-12
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多