なりすましに関するWCFダブルホップの問題について多くの投稿を見てきましたが、特に問題の解決に役立ったものはありません。
私は何が欠けていますか?偽装ユーザー(DOMAIN \ UserName)をサービス2に保持するには、他に何をする必要がありますか?私は確認のためにServiceSecurityContext.Current.WindowsIdentity.Nameを見ています-多分それは間違っています。
セットアップ:
- ローカルホストIISでホストされているクライアントアプリとサービス1へのサービス参照-WindowsIdentityの偽装(DOMAIN \ UserName)
- サービス1-ローカルホストIISでホストされているWCFサービスとサービス2へのサービス参照
- サービス2-ローカルホストIISでホストされているWCFサービス
私は物事を単純にするためにすべてのbasicHttpBindingsを使用しています。両方のサービスエンドポイントにSPNを設定しました。
- ダブルホップを正常に実行でき、コードは正常に実行されます
- サービス1(ホップ1)では、ServiceSecurityContext.Current.WindowsIdentityは、私が偽装した人物です(DOMAIN \ UserName)
- サービス2(ホップ2)では、ServiceSecurityContext.Current.WindowsIdentityはIISアプリプールユーザーです
- ImpersonationLevel="委任"
- どちらのWCFサービスでも、Windows認証が有効になっていて匿名が無効になっています
**注:これはすべて、開発ボックスでローカルに実行しています。それでも、自分から自分への委任を許可するように委任レベルを設定しました。多分やり過ぎ。
バインディング(両方のサービスで同様):
<binding name="...">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
WCFサービスクライアントとサービスエンドポイントの動作構成の両方でimpersonationLevel="Delegation"を設定しました。私のサービスメソッドは、impersonationOption = "Allowed"(ホップ1)とimpersonationOption "Required"(ホップ2)で特別に装飾されています。