![](/img/trans.png)
[英]How is a password within System.Net.CredentialCache.DefaultCredentials encrypted?
[英]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.