Java サーバー コンポーネントと通信する .NET WCF クライアントがあります。サーバー側の認証は、リバース プロキシとして構成された中間の Apache サーバーを介して行われます。
.NET クライアントの構成は次のとおりです。
<basicHttpBinding>
<binding name="AdministrationServiceImplServiceSoapBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
Apache は、Kerveros 認証を要求するように構成されています。
<LocationMatch "^...$">
AuthType Kerberos
Krb5Keytab ...
KrbServiceName HTTP/hostname
KrbMethodNegotiate on
KrbMethodK5Passwd off
Require valid-user
Satisfy All
</LocationMatch>
Windows 7 でアプリケーションを起動すると、すべてが期待どおりに機能します。.NET クライアントは Kerberos を使用し、Apache はクライアントを認証し、Spring セキュリティを使用してクライアント資格情報にアクセスできます。
Windows XP でアプリケーションを起動すると、HTTP 401 エラー メッセージが表示されます。WireShark を使用したネットワーク通信を観察したところ、次のようなことが起こっていることがわかりました。
(1) 認証なしでの Web サービスへの最初のアクセス試行
POST <path> HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Host: <host>
Content-Length: 374
Expect: 100-continue
Connection: Keep-Alive
(2) サーバーからの 100 継続応答
HTTP/1.1 100 Continue
(3) クライアントからの SOAP リクエスト (未認証のまま)
(4) 401 応答を返すサーバー
HTTP/1.1 401 Authorization Required
Server: Apache
WWW-Authenticate: Negotiate
(5) クライアントが認証に NTLM を使用しようとする試み
POST <path> HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Authorization: Negotiate TlRMTVNTUAABAAAAt4IY4gAAAAAAAAAAAAAAAAAAAAAFASgKAAAADw==
Host: <host>
Content-Length: 0
(6) サーバーからの 401 メッセージ (ここでは NTLM を使用しません!)
HTTP/1.1 401 Authorization Required
(7) クライアントの諦め
クライアントからの Base64 ネゴシエート ヘッダーをデコードするとNTLMSSP\x00
、構成ファイルで認証用に "Windows" (別名 Kerberos) が指定されているにもかかわらず、クライアントが NTLM 認証を実行する必要があることが示されます。
Kerberos を使用するように .NET を説得するためにクライアント側でできることはありますか? そうでない場合、クライアントが Kerberos を使用する必要があることを認識できるように、Apache は何を返す必要がありますか?