4

SSLセキュリティとユーザー名/パスワードのクレデンシャルを必要とするサードパーティのSOAP1.1サービスに接続しようとしています。期待されるものの例は次のとおりです。

<soapenv:Header>
    <wsse:Security>
        <wsse:UsernameToken>
            <wsse:Username>username</wsse:Username>
            <wsse:Password>password</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

私のクライアント構成は次のとおりです。

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="thirdpartyservicebindingconfig">
                <security mode="TransportWithMessageCredential">
                    <message clientCredentialType="UserName"
                             algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://..." 
                  binding="basicHttpBinding"
                  bindingConfiguration="thirdpartyservicebindingconfig"
                  contract="thirdpartyservicecontract" 
                  name="thirdpartyserviceendpoint" />
    </client>
</system.serviceModel>

サービスクライアントコードは次のとおりです。

var client = new thirdpartyservicecontractclient();

client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "password";

var result = client.DoSomething();

次の障害例外メッセージが表示されます。

セキュリティプロセッサは、メッセージ内のセキュリティヘッダーを見つけることができませんでした。これは、メッセージがセキュリティで保護されていない障害であるか、通信するパーティ間にバインディングの不一致があることが原因である可能性があります。これは、サービスがセキュリティ用に構成されていて、クライアントがセキュリティを使用していない場合に発生する可能性があります。

編集:
セキュリティモードを「トランスポート」に再構成した場合:
<security mode="TransportWithMessageCredential">
サードパーティのサービスからエラーが発生します:

com.sun.xml.wss.XWSSecurityException:メッセージが構成済みポリシーに準拠していません[AuthenticationTokenPolicy(S)]:セキュリティヘッダーが見つかりません。ネストされた例外はcom.sun.xml.wss.XWSSecurityExceptionです:com.sun.xml.wss.XWSSecurityException:メッセージが構成されたポリシーに準拠していません[AuthenticationTokenPolicy(S)]:セキュリティヘッダーが見つかりません。

このサービスに接続するようにクライアントを構成するにはどうすればよいですか?

  • SSL経由でプレーンテキストのパスワードを使用するWSセキュリティ
4

1 に答える 1

5

リック・シュトラールも同じ問題を抱えていました。問題を説明して解決する彼のブログ投稿へのリンクは次のとおりです。

問題:

問題は、WCFが応答にTimeStampSoapヘッダーを予期していることです。アウトバウンド応答とSoapヘッダーを見ると、そこにタイムスタンプがあることがわかります。タイムスタンプは、Soap応答の戻り時に返されることが期待されます。これはWS-Securityの要件ではないため、WCFはここで「特別な」何かを実行しており、実際にはこのサービス呼び出しを中断していることに注意してください。

解決:

BindingElementCollection elements = client.Endpoint.Binding.CreateBindingElements();
elements.Find<SecurityBindingElement>().IncludeTimestamp = false;
client.Endpoint.Binding = new CustomBinding(elements);

上記のコードは、アウトバウンド呼び出しからタイムスタンプを明示的に削除することでバインディング構成を変更します。これにより、サーバーがタイムスタンプを返す必要がなくなります。そして、これはWCFを幸せにし、電話は通過します。

于 2012-08-19T16:51:52.083 に答える