私は多数のmsdnの記事とcodeplexガイダンスに従いましたが、WCFをKerberos認証と委任で動作させることができず、少し助けていただければ幸いです。
設定
リモートマシンのIISWebサイトにWCFサービスがあります
- Windows2003R2上のIIS6.0-SP2
- マシンのSPNが追加されました(http / myserver && http / myserver:8080)
- IISアプリプール用にADアカウントが作成されました
- ADアカウントには、(Kerberosの場合)委任を許可する設定があり、trueに設定されています
私は8080でBrianBoothのデバッグサイトを使用していますが、このサイトはKerberos委任のすべての要件に合格しています。デバッグIISサイトでは、匿名認証がオフになっており、統合Windows認証がオンになっています。
これらの設定を、WCFサービスをホストしているサイトにミラーリングしました。
Webサービス-Web構成(オリジナル)
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WsHttpBindingConfig">
<security>
<message negotiateServiceCredential="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Service">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="WsHttpBindingConfig"
contract="IService">
<identity>
<servicePrincipalName value="http/myserver" />
<dns value="" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceAuthorization
impersonateCallerForAllOperations="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Webサービス-Webメソッド
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string GetCurrentUserName()
{
string name = WindowsIdentity.GetCurrent().Name;
return name;
}
クライアントアプリ-アプリ構成
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService"
... />
...
<security mode="Message">
<transport clientCredentialType="Windows"
proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows"
negotiateServiceCredential="true"
algorithmSuite="Default"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://myserver/Service.svc"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService"
contract="KerberosService.IService"
name="WSHttpBinding_IService">
<identity>
<servicePrincipalName value="http/myserver" />
</identity>
</endpoint>
</client>
</system.serviceModel>
アプリケーションエラー
テストアプリケーションであるWinFormsアプリがWebメソッドを呼び出そうとすると、次のエラーが発生します。
「HTTP要求はクライアント認証スキーム「匿名」で許可されていません。サーバーから受信した認証ヘッダーは「Negotiate、NTLM」でした。」
イベントログ
次のエラーがイベントログにあります。
例外:System.ServiceModel.ServiceActivationException:コンパイル中の例外のため、サービス'/Service.svc'をアクティブ化できません。例外メッセージは次のとおりです。このサービスのセキュリティ設定には「匿名」認証が必要ですが、このサービスをホストするIISアプリケーションでは有効になっていません。
わかりません。このサービスの要点は、匿名認証を許可しないことです。すべてのユーザー/要求は、Kerberosチケットを使用して認証され、他のマシンに渡される必要があります。
Kerberos認証と委任のためにこのWCFサービスをどのように構成する必要がありますか?
リビジョン1
このSOの質問を読んだ後、メタデータエンドポイントを削除しました。これは問題を解決していません。
リビジョン2
さらに調査した後、wsHttpBindingをbasicHttpBindingに変更することを提案するいくつかの投稿を見つけました。web.configのその部分への変更は以下に含まれており、サービスエンドポイントはそのバインディングを参照するように更新されています。
Webサービス-Web構成(改訂)
<basicHttpBinding>
<binding name="basicBindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
</security>
</binding>
</basicHttpBinding>
クライアントアプリ-アプリ構成(改訂)
<!-- ... -->
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
<message clientCredentialType="UserName"
algorithmSuite="Default" />
</security>
<!-- ... -->
エラー(改訂)
現在のエラーには、Kerberos認証ヘッダーが含まれているようです。
HTTPリクエストは、クライアント認証スキーム「ネゴシエート」では許可されていません。サーバーから受信した認証ヘッダーは'NegotiateSOMEHUGESCARYKEYHERE