5

あなたが私を助けてくれることを願っています。

C# 4.0 アプリケーション内で、認証が必要な Web リクエストをいくつか実行しています。私は単にCredentialsCache.DefaultCredentials. を介して別のスレッド/タスクで機能を実行しない限り、これはうまく機能しますTask<T>.Factory.StartNew(...)。その後、401 エラーが発生します。資格情報が子スレッドに渡されないと思いますか?

資格情報を子タスク/スレッドに渡すにはどうすればよいですか?

4

2 に答える 2

3

偽装を使用していて、問題資格情報がタスクに流れていないことだと思います。この点をチェックしてWindows.Identity.GetCurrent().Name、開始コードとタスク本体の両方で の値をダンプし、それが期待どおりであることを確認することで、野生のガチョウ追跡を回避する価値があります。

上記を考えると、(正式に言えば) 実行コンテキスト (または単にセキュリティ コンテキスト) がスレッド間で流れていない方法がいくつかあります。デフォルトの動作は、コンテキストフローされることです。そのため、何かがそれに影響を与えているに違いありません。

1) 何かが設定されました - これは、タスク内のExecutionContext.SuppressFlow()値をダンプすることで確認できます。ExecutionContext.IsFlowSuppressed()

2)<legacyImpersonationPolicy>デフォルトでfalse. の場合false、WindowsIdentity非同期ポイント間を流れます。trueそうでない場合。これは、ExecutionContext フロー設定に関係ありません。したがってtrue、ここで問題が発生します。SecurityContext.IsWindowsIdentityFlowSuppressed()これは、 is your taskの値をダンプすることで確認できます。これは、 を使用してスレッドごとにプログラムで設定することもできますSecurityContext.SuppressFlowWindowsIdentity()

最後に、完全を期すために、アンマネージ コードを使用している場合に<alwaysFlowImpersonationPolicy>備えて、偽装された資格情報がアンマネージ シナリオでどのようにフローされるかを制御する別の設定があります。説明されているその他の設定は、マネージ コードにのみ影響します。

于 2011-10-17T08:18:15.643 に答える
0

他の誰かがこの問題に遭遇した場合に備えて...私のものは少し異なっていました。私の WCF サービスは、SOAP だけでなく REST サービスとしても公開されており、セキュリティ コンテキストは System.Web.HttpContext.Current または System.ServiceModel.OperationContext.Current から取得されます。私の DAL は、これらのコンテキストの 1 つを使用して、HttpContext.Current.User.Identity または OperationContext.Current.ClaimsPrincipal.Identity をチェックして現在のユーザーを識別します。

したがって、私の場合、これら 2 つのコンテキストを並列 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
});
于 2013-01-25T18:53:28.057 に答える