簡體   English   中英

任務/線程中的CredentialsCache.DefaultCredentials

[英]CredentialsCache.DefaultCredentials within Task / Thread

我希望你能幫助我。

我在我的C#4.0應用程序中執行一些需要身份驗證的Web請求。 我只是使用CredentialsCache.DefaultCredentials 只要我不通過Task<T>.Factory.StartNew(...)在其他線程/任務中運行該功能,此方法Task<T>.Factory.StartNew(...) 然后,我得到401錯誤。 我假設憑據未傳遞到子線程?

如何將憑據傳遞給任何子任務/線程?

我假設你正在使用模擬,而這個問題 ,證書不被流入的任務。 值得檢查這一點,通過在啟動代碼和Task主體中轉儲Windows.Identity.GetCurrent().Name的值,並確保它是您期望的值,以節省開支。

因此,鑒於以上所述,有兩種方法(正式地說)執行上下文(或僅安全上下文)不會跨線程流動。 默認行為是這方面流入 -所以必須有所影響這一點。

1)某些東西已經設置了ExecutionContext.SuppressFlow() -您可以通過在任務內部轉儲ExecutionContext.IsFlowSuppressed()的值來進行檢查。

2)有一個配置元素<legacyImpersonationPolicy> (配置->運行時-> legacyImpersonationPolicy),默認為false false ,的WindowsIdentity 台異步點流動。 如果為true則不是 這與ExecutionContext流設置無關。 所以, true在這里會引起你的問題。 您可以通過轉儲SecurityContext.IsWindowsIdentityFlowSuppressed()的值進行檢查。IsWindowsIdentityFlowSuppressed SecurityContext.IsWindowsIdentityFlowSuppressed()是您的任務。 也可以使用SecurityContext.SuppressFlowWindowsIdentity()每個線程進行編程設置。

最后,為了完整<alwaysFlowImpersonationPolicy> ,如果您使用的是非托管代碼,則還有另一個設置<alwaysFlowImpersonationPolicy> ,它可以控制非托管方案中模擬憑據的流向; 所述的其他設置僅影響托管代碼。

萬一有人遇到這個問題...我的情況有些不同。 我的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
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM