0

テスト用の Windows Server 2012 ドメインがあります。このドメインのメンバーである 2 台のコンピューターがあります。

1 台のコンピューターは Oracle Corporation によって開発されており、仮想マシン上で Linux のバージョンを実行しています。このマシンは、おそらく IBM WebSphere によってホストされている SPNego Kerberos 認証 Web サービスをホストしています。

もう 1 台のコンピュータは、Microsoft 仮想マシンでホストされている Windows XP クライアントです。

Kerberos を使用してユーザーを認証するために、Active Directory 内に SPN を作成しました。

次に、ブラウザを使用して Web サービスをテストしました。WSDL アドレスにより、SOAP データが完全に復元されました。

クライアント プロキシ コードを WCF 4.0 クライアントに組み込み、認証をテストするために再度有効にできるように、Kerberos を無効にしました。

ただし、Client Proxy で提供されているメソッドを使用して Web サービスに接続しようとすると、あらゆる種類のセキュリティ関連のエラーが発生します。

    リモート HTTP サーバーが相互認証の要件を満たしていませんでした。
    リモート サーバーがエラーを返しました: (405) メソッドは許可されていません。

以下は、Web サービスへの接続に使用されるクライアント側の App.config ファイルです。

<configuration>
<system.serviceModel>
    <client>
        <endpoint address="http://oag:8080/pos/GetStoreConfigurationService"
                  binding="wsFederationHttpBinding"
                  bindingConfiguration="wsFederationHttpBinding_ESLGetStoreConfigurationBinding"
                  behaviorConfiguration="ServiceBehavior"
                  contract="ESLGetStoreConfigurationPortType"
                  name="wsFederationHttpBinding_ESLGetStoreConfigurationPort" >
            <identity>
                <servicePrincipalName value="http/oag:8080"/>
            </identity>
        </endpoint>
    </client>
    <bindings>
        <customBinding>
            <binding name="UsernameBinding">
                <binaryMessageEncoding />
                <security authenticationMode="Kerberos"  
                          requireSecurityContextCancellation ="false"
                          requireSignatureConfirmation="false" 
                          messageProtectionOrder ="EncryptBeforeSign"
                          requireDerivedKeys="false" 
                          enableUnsecuredResponse="true" 
                          allowInsecureTransport="true" 
                          securityHeaderLayout="Lax" >
                </security>
                <httpTransport authenticationScheme="Negotiate"  
                               transferMode="Buffered" 
                               maxReceivedMessageSize="67819876"/>
            </binding>
        </customBinding>
        <wsFederationHttpBinding>
            <binding name="wsFederationHttpBinding_ESLGetStoreConfigurationBinding" >
                <security mode="Message">
                    <message negotiateServiceCredential="true" 
                             establishSecurityContext="false"
                             algorithmSuite="Basic128" >
                        <issuer address="http://192.168.100.25" 
                                bindingConfiguration="UsernameBinding"
                                binding="customBinding">
                            <identity>
                                <dns value="WIN-7TN6ALB4TVK.oag-dev.sei"/>
                            </identity>
                        </issuer>
                    </message>
                </security>
            </binding>
        </wsFederationHttpBinding>
    </bindings>
    <behaviors>
        <endpointBehaviors>
            <behavior name="ServiceBehavior">
                <clientCredentials>
                    <windows allowedImpersonationLevel="Identification"/>
                </clientCredentials>
            </behavior>
        </endpointBehaviors>
    </behaviors>
</system.serviceModel>
<system.web>
    <identity impersonate="false" userName="oag-server" password="Password!"/>
</system.web>

ネットワーク資格情報の提供もコードで行われました。しかし、残念ながら、役に立ちませんでした。

ありがとうございました。

4

1 に答える 1

1

1 つのスタック (たとえば、クライアントとサーバーが Java) によって生成されたサンプルの動作する要求/応答のペア (または spnego の場合は複数のメッセージ) を取得できる場合が最善です。次に、これらのメッセージのいずれかに WCF を調整するゲームになります。現在、不明な点が多すぎます。また、AFAIK SPNEGO は WCF のみがサポートするプロトコル (=SOAP メッセージ レベルでの Windows クレデンシャル ネゴシエーション) であるため、サーバーが別のものを使用している可能性があります。

発生した特定のエラーは、SOAP12 の送信中にサーバーが SOAP11 を使用していることを示している可能性があります (たとえば、基本的な http バインディングが必要な場合があります)。ただし、構成の変更は、サーバーがどの SOAP を許可するかについて詳しく知る必要があります。

于 2013-08-31T22:45:03.030 に答える