ダブルホップシナリオで委任が必要なプロジェクトに取り組んでいます。デスクトップクライアントがあり、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.CreateSpnIdentity
WCFサービスでSPNを設定するために使用しました。これは、ドメインユーザーに登録したSPNです。
助言がありますか?前もって感謝します!
EndpointIdentity.CreateSpnIdentity
編集:問題が発生した可能性のあるものを発見しました-クライアントでは使用していませんでした。これを設定すると、「ターゲットプリンシパル名が正しくありません」という内部例外を除いて、「SSPIへの呼び出しに失敗しました」というエラーが表示されます。ただし、クライアントとサーバーに設定したSPNは一致し、どちらもサービスのホスト名と一致します。クライアントとサーバーの両方のSPNを完全に異なるものに設定した場合、またはクライアントの指定されたSPNがサーバーのSPNと一致しない場合、認証は以前と同様にNTLMにフォールバックします。エラーについて調査しましたが、原因を特定できません。助言がありますか?
また、NTLMにフォールバックし、「SSPIへの呼び出しに失敗しました」というエラーを受け取った場合の両方のケースのパケットキャプチャも実行しました。どちらの場合も、NTLMが言及されるまで、同様のパケットが送受信されます。一方、「TURNCHANNEL」パケットはクライアントからサーバーに送信されます。パケットには、NTLMが言及され、ユーザー名とコンピュータ名が送信されるか、SPNのように見えるものを含む「TURNCHANNEL」パケットが送信されるまで、サーバーのIPアドレスを除いて、人間が読み取れるものは何も含まれていません。ホスト名。人間が読める形式のエラーコードやエラーメッセージは表示されません。パケットで何を探すべきかについての提案はありますか?