任务/线程中的CredentialsCache.DefaultCredentials

时间:2011-10-13 16:16:13

标签: c# .net authentication task-parallel-library credentialscache

我希望你能帮助我。

我在C#4.0应用程序中进行一些需要身份验证的webrequests。我只是使用CredentialsCache.DefaultCredentials。只要我不通过Task<T>.Factory.StartNew(...)在不同的线程/任务中运行该功能,这就很有效。然后我得到401错误。我假设凭证不会传递给子线程?

如何将凭据传递给任何子任务/线程?

2 个答案:

答案 0 :(得分:2)

我假设您正在使用模拟,并且问题 表明凭据未流入任务。值得检查这一点,通过在启动代码和任务体中倾倒Windows.Identity.GetCurrent().Name的值并确保它符合您的预期来保存疯狂的追逐。

因此,鉴于上述情况,有两种方法(正式地说)执行上下文(或只是安全上下文)没有跨线程流动。默认行为是上下文 流动 - 所以必须影响它。

1)设置了ExecutionContext.SuppressFlow()的东西 - 您可以通过在任务中转储ExecutionContext.IsFlowSuppressed()的值来检查这一点。

2)配置元素<legacyImpersonationPolicy>(conifguration-&gt; runtime-&gt; legacyImpersonationPolicy)默认为false。当false时,WindowsIdentity 流过异步点。当true 不是时。这与ExecutionContext流设置无关。所以true这会给你带来麻烦。您可以通过转储SecurityContext.IsWindowsIdentityFlowSuppressed()的值来检查这是您的任务。这也可以通过SecurityContext.SuppressFlowWindowsIdentity()每个线程以编程方式设置。

最后,为了完整性,如果您使用的是非托管代码,则还有另一个设置<alwaysFlowImpersonationPolicy>,用于控制非托管方案中模拟凭据的流动方式;描述的其他设置仅影响托管代码。

答案 1 :(得分:0)

如果其他人遇到这个问题......我的情况有点不同。我的WCF服务作为REST服务和SOAP公开,安全上下文来自System.Web.HttpContext.Current或System.ServiceModel.OperationContext.Current。我的DAL使用其中一个上下文通过检查HttpContext.Current.User.Identity或OperationContext.Current.ClaimsPrincipal.Identity来识别当前用户。

因此,对于我的情况,我必须将这两个上下文保存在并行foreach之外的变量中,然后将它们设置在与保存值并行的内部。这似乎成功了。相同的概念可以适用于其他TPL情况并进行一些修改。

var httpcontext = System.Web.HttpContext.Current;
var opcontext = System.ServiceModel.OperationContext.Current;
Parallel.ForEach(types, (p) =>
{
    System.Web.HttpContext.Current = httpcontext;
    System.ServiceModel.OperationContext.Current = opcontext;

    // DO YOUR PARALLEL PROCESSING HERE
});