1

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 は何を返す必要がありますか?

4

1 に答える 1

0

Windows は、Kerberos で保護されたサービスに正しいサービス プリンシパル名 (SPN) を使用しませんでした: Kerberos を使用する場合、Windows はHTTP/$servernameActive Directory で SPN を検索する必要があります。

エラーの考えられる原因は、サービスの SPN が存在せず、作成する必要があることです ( Kerberos 認証の問題 - サービス プリンシパル名 (SPN) の問題 - パート 3 を参照)。ただし、私のセットアップでは、SPN は存在していましたが、どういうわけか Windows はそれらを取得しませんでした)。KerbTrayを使用して、実際には Windows に の Kerberos チケットが含まれていないことを確認しましたHTTP/$servername

解決策は、WCF クライアント構成で SPN を明示的に定義することでした。

<endpoint address="http://$servername/Service" />

なりました

<endpoint address="http://$servername/Service" />
  <identity>
    <servicePrincipalName value="HTTP/$servername" />
  </identity>
</endpoint>
于 2012-05-10T07:56:27.027 に答える