任务/线程中的 CredentialsCache.DefaultCredentials

Max*_*Max 5 .net c# authentication task-parallel-library credentialscache

我希望你能帮助我。

我正在我的 C# 4.0 应用程序中执行一些需要身份验证的 webrequest。我只是使用CredentialsCache.DefaultCredentials. 只要我不通过Task<T>.Factory.StartNew(...). 然后我收到 401 错误。我假设凭据没有传递给子线程?

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

Jam*_*rld 3

我假设您正在使用模拟,问题凭据没有流入任务中。值得检查这一点,通过转储Windows.Identity.GetCurrent().Name启动代码和任务主体中的值并确保它是您所期望的来避免白费力气。

因此,鉴于上述情况,有几种方法(正式地说)执行上下文(或只是安全上下文)不会跨线程流动。默认行为是上下文流动的——所以一定有什么东西在影响它。

1) 某些东西已经设置- 您可以通过转储任务内部ExecutionContext.SuppressFlow()的值来检查这一点。ExecutionContext.IsFlowSuppressed()

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

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