Question

J'ai besoin d'appeler un service web écrit en .NET à partir de Java.Le web service implémente le WS-Security pile (soit WSE 2 ou WSE 3, il n'est pas clair à partir de l'information que j'ai).

Les informations que j'ai reçues du fournisseur de services inclus WSDL, un policyCache.fichier de config, des exemples de code C#, et un exemple d'application qui peuvent réussir à appeler le service.

Ce n'est pas aussi utile que cela puisse paraître, car il n'est pas clair comment je suis censé utiliser cette information pour rédiger un client Java.Si la demande de service web n'est pas signé conformément à la politique alors qu'il est rejeté par le service.Je suis en train d'utiliser Apache Axis2 et je ne peux pas trouver les instructions sur comment je suis censé utiliser le policyCahce.le fichier de configuration et le WSDL pour générer un client.

Il y a plusieurs exemples que j'ai trouvé sur le Web mais dans tous les cas, les auteurs des exemples en avait le contrôle à la fois le service et le client, et étaient donc en mesure de faire quelques réglages sur les deux côtés afin de l'obtenir pour fonctionner.Je ne suis pas dans cette position.

Quelqu'un a fait cela avec succès?

Était-ce utile?

La solution 2

Cela semble être une question populaire donc je vais donner un aperçu de ce que nous avons fait dans notre situation.

Il semble que les services intégrés .NET sont suivant une ancienne ws-addressing standard (http://schemas.xmlsoap.org/ws/2004/03/addressing/) et axis2 comprend uniquement la nouvelle norme (http://schemas.xmlsoap.org/ws/2004/08/addressing/).

En outre, la policyCache.fichier de configuration est fourni sous une forme que le axis2 rempart module ne peut pas comprendre.

Ainsi, les mesures que nous avions à faire, en un mot:

  • Lire la policyCache.config pour essayer de le comprendre.Puis le réécrire dans une politique de rempart pourrait comprendre.(Certains mise à jour docs aidé.)
  • Configurer le rempart de la présente politique.
  • Prenez les clés qui ont été fournies dans le .fichier pfx et de les convertir en un java magasin de clés.Il y a un utilitaire qui vient avec ponton qui peut le faire.
  • Configurer rempart avec cette clé de stockage.
  • Écrire une coutume axis2 gestionnaire en arrière-convertit le plus récent ws-addressing trucs qui vient de axis2 dans le vieux morceaux attendus par le service.
  • Configurer axis2 pour utiliser le gestionnaire sur les messages sortants.

Au final, c'est beaucoup de code et de configuration pour quelque chose qui est censé être un standard ouvert, pris en charge par les vendeurs.

Bien que je ne suis pas sûr de ce que l'alternative est...pouvez-vous attendre de la part des fournisseurs (ou dans ce cas, le fournisseur afin de s'assurer que tout va inter-op?

En post-scriptum, je vais ajouter que je n'ai pas fini de faire le travail, c'était quelqu'un d'autre dans mon équipe, mais je crois que j'ai le détail exact.L'autre option que j'envisage (avant mon coéquipier a pris le dessus) a été d'appeler le WSS4J directement l'API pour construire l'enveloppe SOAP comme l' .NET service que l'on attend d'elle.Je pense que ça aurait fait trop.

Autres conseils

WS-spécifications de Sécurité ne sont pas généralement contenues dans un document WSDL (jamais dans un WSE WSDL).Donc wsdl2java ne sait pas que WS-Security est même requise pour ce service.Le fait que les contraintes de sécurité ne sont pas présents dans un WSE WSDL est une grosse déception pour moi (WCF comprendra WS-Trust de l'information dans un document WSDL).

Sur le client, vous aurez besoin d'utiliser Rempart ajouter le nécessaire WS-Security-têtes de votre client sortant du message.Depuis le WSDL n'est pas un rapport de ce WS-paramètres de Sécurité sont nécessaires, vous êtes mieux en demandant le fournisseur de service de ce qui est nécessaire.WS-exigences de Sécurité peut être simple mot de passe en clair, ou peut-être des certificats X509, ou peut-être un message crypté.....Rempart doit être capable de gérer la plupart de ces scénarios.

Apache Rempart est "allumé" en engageant le module dans votre axis2.xml fichier.Vous aurez besoin de télécharger le Rempart du module et de le mettre dans un endroit précis de votre axis2 répertoire, puis modifier le fichier xml.Vous pouvez également vous engager Rempart par programme (veuillez modifier votre question de départ, si c'est une nécessité et je vais modifier cette réponse).

Selon la façon dont vous configurez rempart (par le biais d'autres fichiers XML, ou par programmation), il va intercepter tous les messages sortants et ajoutez les WS-Sécurité des informations.J'ai personnellement utilisé axis2 avec rempart à l'appel d'un WSE3 service sécurisé avec un élément usernametoken en clair et il a très bien fonctionné.Similaire, mais plus avancé scénarios, il convient également de travail.Il y a plus de détails sur comment configurer et commencer à utiliser le Rempart sur le site lié ci-dessus.Si vous avez des problèmes sur les spécificités de Rempart ou comment utiliser Rempart avec votre WSE de configuration, puis modifiez votre question et je vais essayer de mon mieux pour y répondre.

@Mike

J'ai récemment fait un test et c'est le code que j'ai utilisé.Je ne suis pas en utilisant la politique de trucs, mais j'ai utilisé WS-Security avec l'authentification en texte brut.CXF a vraiment une bonne documentation sur la manière d'accomplir ce genre de choses.

J'ai utilisé wsdl2java et ensuite ajouté ce code pour utiliser le service web avec ws-security.

J'espère que cela vous aide.

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 - J'aurais l'air dans CXF.Je l'ai utilisé pour créer un service web et un client en java à l'aide de ws-security.J'ai aussi branché un .net web service pour elle.

Ils ont de très bonnes documentations trop.J'ai eu plus de chance avec elle que de l'axe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top