4

Metro/WSITライブラリを使用してJavaWebサービスクライアントを作成しています。ヒットする必要のあるWebサービスはWCFサービスです。(私はサービス側とWSDLをほとんどまたはまったく制御できません。)

Webサービスは、トランスポートレベルセキュリティ(SSL)と、セキュリティトークンサービス(WS-Trust / WS-Security)を使用したフェデレーションセキュリティモデルの両方で保護されています。Windows Identity Foundationを使用して.NETにクライアントを簡単に実装し、最初にセキュリティトークンを発行してから、(CreateChannelWithIssuedToken)メソッドを使用して他のWebサービスに要求を行いました。

ただし、Metro / WSITを使用して、Javaでこの動作を模倣するのは困難です。WSDLにWS-Policy情報がないため、WSITはサービスとの通信のセキュリティ処理を有効にしないことを理解しています。送信する前にSOAPリクエストヘッダーを操作してリクエストを行う際にこれを手動で行いましたが、.NETクライアント側で受信するのと同じメッセージを受信して​​います。

今、私の問題は、次のエラーが発生していることです。

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: MustUnderstand headers:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood
at com.sun.xml.ws.protocol.soap.MUTube.createMUSOAPFaultException(MUTube.java:148)
at com.sun.xml.ws.protocol.soap.ClientMUTube.processResponse(ClientMUTube.java:96)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:972)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775)
at com.sun.xml.ws.client.Stub.process(Stub.java:429)
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:168)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151)

SOAP応答のヘッダーにセキュリティセクションがあるためです。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <u:Timestamp u:Id="_0">
            <u:Created>2012-05-14T21:20:08.782Z</u:Created>
            <u:Expires>2012-05-14T21:25:08.782Z</u:Expires>
        </u:Timestamp>
    </o:Security>
</s:Header>
<s:Body>
    ...

WSDLを変更できない場合、Metro / WSDLに手動で強制的に応答のセキュリティ処理を有効にして、この例外がスローされないようにする方法はありますか?セキュリティヘッダーを使用するつもりはありません。応答のペイロードは期待どおりです。クライアントがmustunderstand="1"のヘッダーを理解していない場合、私が見ているのは正しい動作であることは理解していますが、この例外を抑制する方法を探しています。

私はこれのような他の質問を読みましたが、それは私が望むものに近いようですが、私はまだ答えを見つけていません。アドバイス/解決策/など。どうもありがとうございました!

4

1 に答える 1

3

Metro 処理パイプラインに挿入されたカスタム「チューブ」を含む回避策 (当面は適切) を見つけました。

com.sun.xml.ws.api.pipe.helper.AbstractFilterTubeImplを拡張し、オーバーライドするカスタム処理チューブ クラスを作成し、processResponse( Packet packet )「Security」という名前のヘッダーを検索し、packet.getMessage().getHeaders().understood( int )見つけたセキュリティ ヘッダーのヘッダー リスト内のインデックスを呼び出します。これにより、チューブを下る処理がセキュリティヘッダーを理解しようとするのを防ぎます (問題は、それが理解できないことにあるため)。

この後com.sun.xml.ws.assembler.TubeFactory、カスタム チューブ用のチューブ ファクトリ (実装) を作成しました。

次に、webservices-rt.jar/META-INF/metro-default.xml の内容をプロジェクトの META-INF/metro.xml にコピーし<tube-factory>、ファクトリ クラスの要素を追加しました。<client-side>トランスポート チューブ ファクトリのすぐ上に配置<endpoint-side>し、リストの一番上、トランスポート チューブ ファクトリの上に配置します。

うまくいけば、これは同様の問題を抱えている人に役立ちます。カスタム処理を Metro パイプラインに追加できることは非常に強力ですが、危険でもあります。YMMV。

于 2012-05-16T18:09:20.110 に答える