0

ダブルホップシナリオで委任が必要なプロジェクトに取り組んでいます。デスクトップクライアントがあり、net.tcpバインディングを使用してWCFサービスに接続し、別のサーバー上のSQLデータベースに接続しています。私たちの目標は、ユーザーの資格情報を使用してSQLデータベースにアクセスすることです。

WCFサービスとSQLデータベースの両方が、SQLデータベースの委任が有効になっている同じドメインユーザーの下で実行されています。ここでの指示に従いましたが、成功しませんでした。

ここで、ログにいくつかの詳細が記録されます。SQLデータベースで使用されるログインは、WCFサービスが実行されているユーザーとして表示され、Kerberosを使用します。WCFサーバーで使用されるログインは、クライアントのユーザーとして表示されますが、NTLMを使用します。[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]またはを使用するusing (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())と、WCFサーバー上でコマンドがクライアントとして実行されます。これにより、なりすましが正常に機能していると私は信じています。

では、最初のホップがNTLMにフォールバックする原因は何でしょうか。SPNの問題であると思われますが、WCFサービスとSQLサービスの両方のSPNを共有ドメインユーザーに登録しました。また、上記の手順に従って、SQLサービスをドメインユーザーの委任に対して信頼できるものとして設定しました。

EndpointIdentity.CreateSpnIdentityWCFサービスでSPNを設定するために使用しました。これは、ドメインユーザーに登録したSPNです。

助言がありますか?前もって感謝します!

EndpointIdentity.CreateSpnIdentity編集:問題が発生した可能性のあるものを発見しました-クライアントでは使用していませんでした。これを設定すると、「ターゲットプリンシパル名が正しくありません」という内部例外を除いて、「SSPIへの呼び出しに失敗しました」というエラーが表示されます。ただし、クライアントとサーバーに設定したSPNは一致し、どちらもサービスのホスト名と一致します。クライアントとサーバーの両方のSPNを完全に異なるものに設定した場合、またはクライアントの指定されたSPNがサーバーのSPNと一致しない場合、認証は以前と同様にNTLMにフォールバックします。エラーについて調査しましたが、原因を特定できません。助言がありますか?

また、NTLMにフォールバックし、「SSPIへの呼び出しに失敗しました」というエラーを受け取った場合の両方のケースのパケットキャプチャも実行しました。どちらの場合も、NTLMが言及されるまで、同様のパケットが送受信されます。一方、「TURNCHANNEL」パケットはクライアントからサーバーに送信されます。パケットには、NTLMが言及され、ユーザー名とコンピュータ名が送信されるか、SPNのように見えるものを含む「TURNCHANNEL」パケットが送信されるまで、サーバーのIPアドレスを除いて、人間が読み取れるものは何も含まれていません。ホスト名。人間が読める形式のエラーコードやエラーメッセージは表示されません。パケットで何を探すべきかについての提案はありますか?

4

1 に答える 1

0

エラーが見つかりました - クライアントはサーバーの IP アドレスを使用して接続を作成していました。IP を完全修飾ドメイン名に切り替えた後、最初のホップは一貫して Kerberos を使用して認証します。

IP アドレスは、両方の SPN で使用した同じ文字列に解決されますが、クライアントは、他のチェックを実行する前に、接続文字列が SPN のスラッシュに続く部分と一致するかどうかをチェックすると思います。

ネットワーク サービスとドメイン ユーザーの両方を使用して結果をテストしましたが、SPN がコンピューターまたはユーザーにそれぞれ登録されている限り、問題はありませんでした。

この回答が他の人の時間と手間を省くことを願っています!


追記: これにより、すべての接続で Kerberos 認証が有効になりましたが、この状況では不要であることが後でわかりました。データベースへの接続の一部がブロックを使用した偽装の内部になかったため、テーブルの読み取りが失敗していました。その後、すべての委任と SPN 関連のコードを削除しましたが、データベース接続は引き続き正しく機能しています。最初のホップは NTLM を使用しています。資格情報が SQL サーバーでどのように使用されているかは正確にはわかりません。私たちの接続は、Kerberos と委任を必要とするダブル ホップ シナリオとして説明されているものとまったく同じように見えますが、何が機能しているのかについて議論するのは難しいです. このドキュメントの委任の下にあるメモと関係があるのではないかと思います:

クライアントがバックエンド サービスの Windows アカウントに対応するユーザー名とパスワードを使用してフロントエンド サービスに対して認証を行う場合、フロントエンド サービスは、クライアントのユーザー名とパスワードを再利用してバックエンド サービスに対して認証を行うことができます。 . ユーザー名とパスワードをバックエンド サービスに渡すとバック​​エンド サービスが偽装を実行できるようになるため、これは ID フローの特に強力な形式ですが、Kerberos が使用されていないため委任にはなりません。委任に関する Active Directory の制御は、ユーザー名とパスワードの認証には適用されません。

それが機能している理由について他の提案があれば、ぜひ聞いてみたいです。ただし、別の質問を開く価値があるとは思いません。

于 2012-09-18T00:15:41.613 に答える