23

.NET で記述された Web サービスを Java から呼び出す必要があります。Web サービスは WS-Security スタックを実装します (WSE 2 または WSE 3 のいずれか、私が持っている情報からは明らかではありません)。

サービス プロバイダーから受け取った情報には、WSDL、policyCache.config ファイル、いくつかのサンプル C# コード、およびサービスを正常に呼び出すことができるサンプル アプリケーションが含まれていました。

この情報を使用して Java クライアントを作成する方法が明確でないため、これは思ったほど役に立ちません。Web サービス要求がポリシーに従って署名されていない場合、サービスによって拒否されます。Apache Axis2 を使用しようとしていますが、policyCahce.config ファイルと WSDL を使用してクライアントを生成する方法についての説明が見つかりません。

私が Web で見つけたいくつかの例がありますが、いずれの場合も、例の作成者はサービスとクライアントの両方を制御しており、動作させるために両側で微調整を行うことができました。私はその立場ではありません。

誰もこれを成功させましたか?

4

5 に答える 5

10

通常、WS-Security 仕様は WSDL には含まれません (決して WSE WSDL には含まれません)。そのため、wsdl2java は、このサービスに WS-Security が必要であることさえ知りません。セキュリティ制約が WSE WSDL に存在しないという事実は、私にとって大きな失望です (WCF は WS-Trust 情報を WSDL に含めます)。

クライアント側では、Rampartを使用して、必要な WS-Security ヘッダーを送信クライアント メッセージに追加する必要があります。WSDL はどの WS-Security 設定が必要かを報告しないため、何が必要かをサービス プロバイダーに問い合わせるのが最善の方法です。WS-Security の要件は、単純なプレーンテキストのパスワード、X509 証明書、または暗号化されたメッセージである可能性があります。Rampart は、これらのシナリオのほとんどを処理できるはずです。

axis2.xml ファイルでモジュールを使用すると、Apache Rampart が「オン」になります。Rampart モジュールをダウンロードして axis2 ディレクトリの特定の場所に配置し、xml ファイルを変更する必要があります。プログラムで Rampart に参加することもできます (これが要件である場合は、元の質問を編集してください。この回答を編集します)。

ランパートの構成方法 (他の XML ファイルまたはプログラムによる) に応じて、ランパートは発信メッセージをインターセプトし、必要な WS-Security 情報をそれに追加します。私は個人的に、プレーンテキストの UsernameToken で保護された WSE3 サービスを呼び出すために、軸 2 と壁を使用しましたが、うまく機能しました。同様ですが、より高度なシナリオも機能するはずです。上記のリンク先のサイトには、Rampart をセットアップして開始する方法の詳細が記載されています。Rampart の詳細や特定の WSE セットアップで Rampart を使用する方法について問題がある場合は、質問を編集してください。最善を尽くして回答します。

于 2008-09-17T14:23:23.587 に答える
3

@マイク

私は最近テストを行いましたが、これは私が使用したコードです。ポリシー関連のものは使用していませんが、プレーン テキスト認証で WS-Security を使用しました。CXF には、このようなことを達成する方法に関する非常に優れたドキュメントがあります。

私は wsdl2java を使用し、次にこのコードを追加して、ws-security で Web サービスを使用しました。

これがお役に立てば幸いです。

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.handler.WSHandlerConstants;

public class ServiceTest implements CallbackHandler
{

     public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

            WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
            // set the password for our message.
            pc.setPassword("buddah");
        }

    public static void main(String[] args){
        PatientServiceImplService locator = new PatientServiceImplService();
        PatientService service = locator.getPatientServiceImplPort();

        org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy.getClient(service);
        org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint();

        Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN + " " +  WSHandlerConstants.TIMESTAMP);
        outProps.put(WSHandlerConstants.USER, "joe");
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);

        // Callback used to retrieve password for given user.
        outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, ServiceTest.class.getName());

        WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        cxfEndpoint.getOutInterceptors().add(wssOut);


        try
        {
            List list = service.getInpatientCensus();
            for(Patient p : list){
                System.out.println(p.getFirstName() + " " + p.getLastName());
            }

        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
于 2008-08-19T21:18:27.643 に答える
2
于 2008-08-19T16:19:51.177 に答える
0

CXF - CXF を検討します。ws-secuirty を使用して Java で Web サービスとクライアントを作成するために使用しました。.net Web サービスも接続しました。

彼らもかなり良いドキュメントを持っています。軸よりも運が良かった。

于 2008-08-19T16:06:09.003 に答える