c# – 任务/线程中的CredentialsCache.DefaultCredentials

我希望你能帮助我.

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

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

最佳答案 我假设你正在使用模拟,问题是凭据没有流入任务.通过倾销
Windows.Identity.GetCurrent()的值来检查这一点以保存一个疯狂的追逐是值得的.在启动代码和任务体中都有名称,并确保它符合您的期望.

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

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

2)有一个配置元素< legacyImpersonationPolicy> (conifguration-> runtime-> legacyImpersonationPolicy)默认为false.如果为false,则WindowsIdentity会在非同步点上流动.如果是真的那就不是.这与ExecutionContext流设置无关.这么真实会给你带来麻烦.您可以通过转储SecurityContext的值来检查这一点.IsWindowsIdentityFlowSuppressed()是您的任务.这也可以使用SecurityContext.SuppressFlowWindowsIdentity()以编程方式为每个线程设置.

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

点赞