3

私のDBAでは、すべてのデータベースアクセスを信頼できるドメインアカウントを介して行う必要があります。これは、web.configを設定した場合に実行できます。これには、ユーザーがログインするか、IEが資格情報を渡すためのドメインにいる必要があります。コードを使用してユーザーになりすます。このナレッジベースの記事にあるコードを使用しています。

http://support.microsoft.com/kb/306158

これはうまく機能します。クレデンシャルを渡し、ユーザーになりすましてから、データベースを呼び出すと、データが返されます。

問題は、別のページに移動すると、偽装された資格情報が失われることです。これは、データベースを呼び出すたびに、偽装コードを実行する必要があることを意味します。

IISがすべてのページでドメインユーザーを偽装できる場合、コードの使用中にユーザーを偽装できないのはなぜですか?

スレッドコンテキストの切り替えがあるようです。Aspnet.configファイルでalwaysFlowImpersonatingPolicyを設定しようとしましたが、機能しませんでした。

http://msdn.microsoft.com/en-us/library/ms229553.aspx

なにか提案を?私がやりたいことをすることさえ可能ですか?

4

2 に答える 2

3

なりすましはスレッドのレベルで発生します。偽装により、通常はプロセスから継承されるスレッドのアクセス トークンが別のものに置き換えられます。ベスト プラクティスは、必要な操作が完了したらすぐに偽装の効果を元に戻し、トークンを元に戻すことです。IIS でも ASP.NET でも、話は変わりません。通常、各リクエストは個別のスレッドによって処理されるため、各スレッドがユーザーになりすます必要があります。

つまり、データベースを呼び出すたびに、偽装コードを実行する必要があります。

それは正しいです。

IIS がすべてのページでドメイン ユーザーを偽装できる場合、コードの使用中にユーザーを偽装できないのはなぜですか?

IIS はそれを別の方法で行うわけではないため、認識された錯覚にすぎない可能性があります。すべてのページが同じスレッドによって提供され、各ページが提供されるときに偽装トークンが元に戻されていない場合を除き、すべてのページでユーザーを偽装することはできません。

スレッドコンテキストの切り替えを伴うもののようです。

あまり。非同期処理を行っていない限り(質問ではそうは述べていません)、偽装コンテキストのフローは関係ありません。単一の要求の処理中に直接的または間接的にスレッド切り替えを引き起こしている場合にのみ、偽装コンテキストの流れについて心配する必要があります。セカンダリ (ワーカー) スレッドによって実行される作業が、プライマリ スレッドの偽装コンテキストで引き続き実行されるようにする場合は、セカンダリ スレッドが偽装トークンを借用するようにする必要があります。.NET Framework 1.1 では、細心の注意を払い、偽装コンテキストのフローを手動で調整する必要がありました。ただし、.NET 2.0 では、ExecutionContext API が導入され、多くの面倒な作業が行われます。

于 2008-09-25T00:52:07.097 に答える
1

偽装コンテキストが失われる理由は、新しいページ リクエストが終了するたびに偽装コンテキストが範囲外になるためです。

ドキュメントに従って、<alwaysFlowImpersonationPolicy>非同期呼び出し間で同じ偽装コンテキストが維持されるようにするために使用されます。たとえば、リモート Web サービスへの非同期呼び出しを行う場合、コールバック偽装コンテキストは開始スレッドと同じです。ASP.NET の場合、偽装コンテキストは、ページ要求の存続期間中のみフローします。

于 2008-09-25T00:31:59.593 に答える