Frage

Ich brauche für den Aufruf eines web service geschrieben .NET von Java.Der web-service implementiert das WS-Security-stack (entweder WSE WSE 2 oder 3, es ist nicht klar aus den Informationen, die ich habe).

Die Informationen, die ich erhielt von den service-Anbieter inklusive WSDL, eine policyCache.config-Datei, die einige Beispiel-C# - code und eine Beispielanwendung, die erfolgreich den Kundendienst rufen.

Dies ist nicht so nützlich wie es klingt, weil es nicht klar ist, wie soll ich diese Informationen benutzen, um schreiben ein Java-client.Wenn die web-service-Anforderung ist nicht signiert nach der Politik, dann ist es vom Dienst abgelehnt.Ich versuche, Apache Axis2 und ich finde keine Anleitung, wie ich bin sollen die policyCahce.config-Datei und der WSDL zu generieren, die ein client.

Es gibt mehrere Beispiele, die ich gefunden habe, auf dem Web, aber in allen Fällen die Autoren der Beispiele hatte die Kontrolle über den Dienst und den client und so konnten Verbesserungen auf beiden Seiten, um es zu bekommen zu arbeiten.Ich bin nicht in dieser position.

Hat jemand dies getan, erfolgreich zu sein?

War es hilfreich?

Lösung 2

Dies scheint eine beliebte Frage, also werde ich einen überblick bieten, was wir in unserer situation.

Es scheint, dass die Dienstleistungen eingebaut .NET sind, nach einer älteren ws-addressing-standard (http://schemas.xmlsoap.org/ws/2004/03/addressing/) und axis2 nur versteht die neuere Norm (http://schemas.xmlsoap.org/ws/2004/08/addressing/).

Zusätzlich, die policyCache.config-Datei in einer form, die die axis2-Wall-Modul nicht verstehen kann.

Also die Schritte, die wir zu tun hatten, in einer nussschale:

  • Lesen Sie die policyCache.config und versuchen, es zu verstehen.Dann schreiben Sie es in die Politik, dass rampart verstehen konnte.(Einige aktualisiert docs geholfen.)
  • Konfigurieren von rampart dieser Datenschutzerklärung.
  • Nehmen Sie die Tasten, die zur Verfügung gestellt wurden, in der .pfx-Datei und konvertieren Sie Sie in einen java-Schlüsselspeicher.Es ist ein Dienstprogramm, mit Steg, die das tun können.
  • Konfigurieren Wall mit diesem Schlüssel speichern.
  • Schreiben Sie eine benutzerdefinierte axis2-handler, der rückwärts-wandelt den neueren ws-addressing-Sachen, die von axis2 in den älteren Sachen erwartet von dem service.
  • Konfigurieren axis2 verwenden Sie den handler auf ausgehende Nachrichten.

Am Ende war es eine Menge von Konfiguration und code für etwas, das sein soll ist ein offener standard und unterstützt durch die Hersteller.

Obwohl ich nicht sicher bin, was die alternative ist...können Sie warten, bis der Hersteller (oder in diesem Fall einen Verkäufer), um sicherzustellen, dass alles inter-op?

Als postscript werde ich hinzufügen, dass ich nicht am Ende tut die Arbeit, es war jemand anderes in meinem team, aber ich denke ich habe die wichtigsten details zu korrigieren.Die andere option, die ich erwäge, (vor meinem Teamkollegen übernahm) war ein Telefonat mit dem WSS4J-API direkt zu konstruieren, die den SOAP-Umschlag der .NET service erwartet Sie.Ich denke, das würde gearbeitet haben, auch.

Andere Tipps

WS-Security-Spezifikationen sind in der Regel nicht enthalten in WSDL (nie im WSE WSDL).So wsdl2java nicht wissen, dass WS-Security ist auch erforderlich für diese service.Die Tatsache, dass die security-Einschränkungen sind nicht vorhanden, in einer WSE WSDL ist eine große Enttäuschung für mich (WCF gehören WS-Trust-Informationen in einer WSDL).

Auf der client-Seite, Sie müssen verwenden Rampart das hinzufügen von erforderlichen WS-Security-Header, um Ihre ausgehenden client-Nachricht.Da die WSDL nicht berichten, was die WS-Security-Einstellungen erforderlich sind, sind Sie am besten ab, indem er die service-provider, was erforderlich ist.WS-Security-Anforderungen können einfache Klartext-Kennwort, oder vielleicht werden X509 Zertifikate, oder vielleicht verschlüsselten Nachricht.....Rampart sollte in der Lage sein, um Griff die meisten dieser Szenarien.

Apache Rampart "eingeschaltet" durch die Einbindung des Moduls in Ihrem axis2.xml Datei.Sie benötigen zum herunterladen des Rampart-Modul und setzen Sie es in einem bestimmten Ort in Ihrem axis2-Verzeichnis, ändern Sie die xml-Datei.Sie können sich auch Rampart programmgesteuert (bitte Bearbeiten Sie Ihre ursprüngliche Frage auf, ob dies eine Verpflichtung, und ich werde Bearbeiten Sie diese Antwort).

Je nachdem, wie Sie konfiguriert rampart (durch andere XML-Dateien oder programmgesteuert), es fängt alle ausgehenden Nachrichten und fügen Sie die erforderlichen WS-Sicherheit Informationen zu es.Ich habe persönlich verwendet axis2 mit rampart zum aufrufen einer WSE3 service, die ist gesichert mit UsernameToken in Klartext und es hat Super geklappt.Ähnliche, aber komplexere Szenarien sollten auch funktionieren.Es gibt noch mehr details auf wie zu set up und beginnen Sie mit Wall auf der oben verlinkten Website.Wenn Sie Probleme haben, über die Besonderheiten von Rampart oder wie man mit Wallanlage mit Ihren besonderen WSE setup, dann Bearbeiten Sie Ihre Frage und ich werde mein bestes versuchen zu beantworten.

@Mike

Ich habe vor kurzem eine test-und dies ist der code, den ich verwendet.Ich bin nicht mit Politik Zeug, aber ich habe die WS-Sicherheit mit Klartext-Authentifizierung.CXF hat wirklich gute Dokumentation, wie dies zu erreichen Zeug.

Ich verwendet wsdl2java und dann Hinzugefügt, dass dieser code der web service ws-security.

Ich hoffe, das hilft Ihnen heraus.

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();
        }
    }
}

CXF - Ich würde schauen in CXF.Ich habe Sie verwendet, um einen web service und client in java mithilfe von ws-secuirty.Ich auch angeschlossen .net-web-service, um Sie.

Sie haben sehr gute Dokumentation zu.Ich hatte mehr Glück als Achse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top