Vous pouvez demander des jetons SAML avec la méthode de confirmation
des sujets bearer à un STS (Security Token Service) externe. Une fois que vous avez obtenu les jetons SAML bearer, vous pouvez les envoyer
dans des messages de demande de services Web à l'aide du modèle de
programmation JAX-WS (Java™ API for
XML-Based Web Services) et des API WSS (Web Services Security).
Avant de commencer
On considère ici que vous connaissez le modèle de programmation JAX-WS, les API WSS, les concepts de SAML et l'utilisation des ensembles de règles pour configurer et administrer les paramètres des services Web.
Pourquoi et quand exécuter cette tâche
Vous pouvez demander à un STS externe un jeton SAML avec la méthode de
confirmation des sujets bearer, puis l'envoyer dans les messages de demande
de services Web à partir d'un client de services Web à l'aide d'API WSS.
Le client d'application de services Web utilisé dans cette tâche est une version modifiée du code client contenu dans l'application modèle JaxWSServicesSamples disponible pour le téléchargement.
Des fragments de code du modèle sont décrits dans la section Procédure, et la section Exemple contient un modèle de client de services Web prêt à l'emploi.
Procédure
- Identifiez et obtenez le client de services Web que vous souhaitez utiliser pour appeler un fournisseur de services Web.
Utilisez ce client pour programmer l'insertion des jetons SAML dans des messages de demande SOAP à l'aide des API WSS.
Le client de services Web utilisé dans cette procédure
est une version modifiée du code client contenu dans l'exemple d'application
de services Web JaxWSServicesSamples.
Pour obtenir le modèle de client de services Web et le modifier en ajoutant les API de Services de sécurité (WSS), afin de programmer la transmission de jetons SAML dans les messages de demande SOAP, procédez comme suit :
- Téléchargez l'exemple d'application JaxWSServicesSamples. Le modèle d'application JaxWSServicesSamples n'est pas installé par défaut.
- Obtenez le code client JaxWSServicesSamples.
Pour les besoins de l'exemple, cette procédure utilise une version modifiée du client léger Echo compris dans le modèle JaxWSServicesSamples. L'exemple de fichier client fin Echo de services Web, SampleClient.java,
est situé dans le répertoire src\SampleClientSei\src\com\ibm\was\wssample\sei\cli. L'exemple de fichier de classe est inclus au fichier WSSampleClientSei.jar.
L'application d'entreprise JaxWSServicesSamples.ear
et la prise en charge des fichiers d'archive Java
(JAR) sont situés dans le répertoire installableApps
dans l'exemple d'application JaxWSServicesSamples.
- Déployez le fichier JaxWSServicesSamples.ear
dans le serveur d'application. Une fois le fichier JaxWSServicesSamples.ear déployé, vous êtes prêt à tester le modèle de code de client de services Web avec le modèle d'application.
Au lieu d'utiliser le modèle de client de services web, vous pouvez choisir d'intégrer à votre propre
application client de services Web les fragments de code destinés à programmer la transmission des jetons SAML dans
les messages de demande SOAP à l'aide des API WSS. L'exemple pris dans cette procédure utilise un client léger de services Web
JAX-WS ; il est cependant possible d'utiliser un client géré.
- Associez l'ensemble de règles par défaut SAML20 Bearer WSHTTPS au fournisseur de services Web. Cet ensemble de règles sert à protéger les messages à l'aide du transport HTTPS. Pour plus d'informations sur la façon d'associer l'ensemble de règles par
défaut SAML20 Bearer WSHTTPS Default au fournisseur de services Web,
reportez-vous à la section relative à la configuration des clients et des
fournisseurs pour le jeton SAML bearer (porteur).
- Associez les liaisons générales par défaut du modèle SAML Bearer Provider Sample au modèle de fournisseur de services Web. Pour plus d'informations sur la façon d'affecter les liaisons générales par défaut du modèle par défaut SAML Bearer Provider Default à votre application de services Web, reportez-vous à la section relative à la configuration des clients et des fournisseurs pour le jeton SAML bearer (porteur).
- Vérifiez que les propriétés personnalisées trustStoreType,
trustStorePassword et trustStorePath correspondent au fichier de clés
certifiées contenant le certificat de signataire de STS. A l'aide de la console d'administration, procédez comme suit :
- Cliquez sur .
- Cliquez sur gen_saml11token dans la table des jetons d'authentification.
- Cliquez sur Gestionnaire d'appel.
- Dans la section Propriétés personnalisées, vérifiez que les propriétés personnalisées trustStoreType,
trustStorePassword et trustStorePath correspondent au fichier de clés
certifiées contenant le certificat de signataire de STS.
- Demandez le jeton SAML à un STS externe. Le fragment de code suivant montre comment demander le jeton SAML
et suppose qu'un STS externe est configuré pour accepter un
jeton Username et émettre un jeton SAML 2.0 après
validation :
//Demande du jeton SAML à un STS externe
WSSFactory factory = WSSFactory.getInstance();
String STS_URI = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext();
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "Bearer");
SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
// Ajout de UNT à la demande sécurisée
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
gencont1.add(ut);
cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
System.out.println("SAMLToken id = " + samlToken.getId());
- Ajoutez le fichier JAR du client léger JAX-WS au chemin d'accès aux classes. Ajoutez le fichier racine_serveur_app/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar
au chemin d'accès aux classes. Pour plus d'informations sur l'ajout de ce fichier JAR au chemin d'accès aux classes, consultez la rubrique relative au test des clients compatibles avec les services Web.
- Utilisez la méthode WSSFactory newSecurityToken pour demander un jeton
SAML à un STS externe.
Indiquez la méthode suivante pour demander un jeton SAML :
WSSFactory newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
La demande d'un jeton SAML requiert le droit d'accès Java wssapi.SAMLTokenFactory.newSAMLToken. Utilisez l'outil Policy Tool pour ajouter l'instruction de règle suivante au
fichier de règles de sécurité Java ou au
fichier du client d'application was.policy :
permission java.security.SecurityPermission "wssapi.SAMLTokenFactory.newSAMLToken"
Le paramètre SAMLToken.class définit le type de jeton à créer.
L'objet
callbackHandler contient les paramètres qui
définissent les caractéristiques du jeton SAML que vous demandez et les autres
paramètres requis pour atteindre le STS et obtenir le jeton SAML. L'objet SAMLGenerateCallbackHandler spécifie les
paramètres de configuration décrits dans le tableau ci-dessous :
Tableau 1. Propriétés de SAMLGenerateCallbackHandler. Ce tableau décrit les paramètres de configuration de l'objet SAMLGenerateCallbackHandler utilisant la méthode de confirmation du sujet bearer.Propriété |
Description |
Obligatoire |
SamlConstants.CONFIRMATION_METHOD |
Définit l'utilisation de la méthode de confirmation bearer. |
Oui |
SamlConstants.TOKEN_TYPE |
Indique le type de jeton.
Lorsqu'un client de services Web est associé à des ensembles de règles, cette propriété n'est pas utilisée par l'environnement d'exécution de sécurité des Services Web.
Spécifiez le type de valeur du jeton à l'aide de l'attribut valueType de la configuration de liaison du générateur de jetons.
L'exemple pris dans cette procédure utilise un jeton SAML 2.0 ; il est cependant possible d'utiliser la valeur WSSConstants.SAML.SAML11_VALUE_TYPE.
|
Oui |
SamlConstants.STS_ADDRESS |
Indique l'adresse du service de
jeton de sécurité (STS).
Pour l'exemple utilisé dans cette rubrique de
tâche, la valeur de cette propriété est https afin de spécifier l'utilisation de SSL
pour protéger la demande de jeton SAML.
Vous devez définir la propriété
-Dcom.ibm.SSL.ConfigURL afin d'activer l'utilisation de SSL pour protéger la
demande de jeton SAML avec le STS.
|
Oui |
SamlConstants.SAML_APPLIES_TO |
Indique l'adresse du STS cible pour laquelle
vous souhaitez utiliser le jeton SAML. |
Non |
SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST |
Indique si le système doit demander au STS
un jeton unique imbriqué dans un élément RequestSecurityToken (RST) ou plusieurs jetons d'une collection
d'éléments RST imbriqués dans un seul élément RequestSecurityTokenCollection (RSTC). Le
comportement par défaut consiste à demander un jeton unique imbriqué dans un
élément RequestSecurityToken (RST) au STS.
Si vous spécifiez la valeur
true pour cette propriété, plusieurs jetons d'une
collection d'éléments RST imbriqués dans un seul élément
RequestSecurityTokenCollection (RSTC) sont demandés au STS.
|
Non |
SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE |
Spécifie l'espace de nom WS-Trust inclus dans la demande
WS-Trust. |
Non |
Une instance WSSGenerationContext et une instance WSSConsumingContext sont
également définies dans l'objet SAMLGenerateCallbackHandler. L'instance WSSGenerationContext doit contenir un objet UNTGenerateCallbackHandler
avec les informations permettant de créer l'élément UsernameToken à envoyer au
STS.
Le paramètre
system.wss.generate.saml définit le module de connexion JAAS (Java Authentication
and Authorization Service) utilisé pour créer le jeton SAML. Vous devez spécifier une propriété JVM pour définir un fichier de configuration JAAS contenant la configuration requise pour la connexion JAAS, par exemple :
-Djava.security.auth.login.config=racine_profil/properties/wsjaas_client.conf
A la place, vous pouvez également spécifier un fichier de configuration de la connexion JAAS en définissant une propriété système Java dans le modèle de code client, par exemple :
System.setProperty("java.security.auth.login.config", "racine_profil/properties/wsjaas_client.conf ");
- Obtenez l'identificateur du jeton SAML créé.
Utilisez l'instruction suivante comme une simple test pour le jeton SAML que vous avez créé :
System.out.println("SAMLToken id = " + samlToken.getId())
- Ajoutez le jeton SAML à l'en-tête de sécurité SOAP des messages de demande
de services Web.
- Initialisez le client de services Web. Le fragment de code suivant illustre ces actions :
// Initialiser le client de services Web
EchoService12PortProxy echo = new EchoService12PortProxy();
echo._getDescriptor().setEndpoint(endpointURL);
// Configurer les propriétés SOAPAction
BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
Map<String, Object> requestContext = bp.getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
- Initialisez WSSGenerationContext. Le code ci-dessous illustre l'utilisation de l'interface WSSGenerationContext pour initialiser un contexte de génération et vous permettre d'insérer SAMLToken dans le message de demande de services Web :
// Initialiser WSSGenerationContext
WSSGenerationContext gencont = factory.newWSSGenerationContext();
gencont.add(samlToken);
Spécifiquement, l'appel de la méthode
gencont.add(samlToken) définit l'insertion du jeton SAML dans un message de demande. Utilisez l'outil Policy Tool pour ajouter l'instruction de règle suivante au
fichier de règles de sécurité Java ou au
fichier du client d'application was.policy :
permission javax.security.auth.AuthPermission "modifyPrivateCredentials"
- Ajoutez l'élément d'horodatage dans l'en-tête de sécurité des messages SOAP. L'ensemble de règles SAML20 Bearer WSHTTPS Default requiert que l'en-tête de sécurité SOAP des messages de demande de services Web et des messages de réponse contiennent un élément d'horodatage. Dans le fragment de code qui suit, la méthode factory.newWSSTimestamp() génère l'horodatage, et la méthode gencont.add(timestamp) spécifie l'heure et la date à insérer dans le message de demande :
// Ajouter l'horodatage dans le message de demande.
WSSTimestamp timestamp = factory.newWSSTimestamp();
gencont.add(timestamp);
gencont.process(requestContext);
- Associez l'objet WSSGenerationContext à l'objet de services Web RequestContext. L'objet WSSGenerationContext contient désormais toutes les informations de sécurité nécessaires au formatage d'un message de demande. L'appel de méthode gencont.process(requestContext)associe l'objet WSSGenerationContext à l'objet RequestContext des services Web pour permettre à l'environnement d'exécution de sécurité des Services de mettre en forme l'en-tête de sécurité SOAP requis, par exemple :
// Associe l'objet WSSGenerationContext à l'objet de services Web RequestContext.
gencont.process(requestContext);
- Définissez la protection des messages de niveau transport SSL à l'aide des propriétés JVM.
L'ensemble de règles SAML20 Bearer WSHTTPS Default requiert la protection des messages au niveau du transport SSL. En
outre, vous pouvez utiliser cette même propriété pour activer la protection de
la demande de jeton SAML au STS à l'aide de SSL. Définissez la protection des messages de niveau transport SSL à l'aide des propriétés JVM :
-Dcom.ibm.SSL.ConfigURL=file:racine_profil\properties\ssl.client.props
A la place, vous pouvez également définir le fichier de configuration SSL en définissant une propriété système Java dans le modèle de code client, par exemple :
System.setProperty("com.ibm.SSL.ConfigURL", "file:racine_profil/properties/ssl.client.props");
Résultats
Vous avez demandé à un STS externe un jeton SAML avec la méthode de
confirmation des sujets bearer, avec protection au niveau du transport. Une fois
le jeton obtenu, vous l'avez envoyé avec des messages
de demande de services Web à l'aide du modèle de programmation JAX-WS et des
API WSS.
Si vous souhaitez demander à un STS externe un jeton SAML avec
la méthode de confirmation des sujets bearer et la protection au niveau des
messages, reportez-vous à la documentation relative à la demande à un STS
externe de jetons SAML sender-vouches à l'aide d'API WSS et de la
protection au niveau des messages. Pour utiliser la protection au niveau des messages pour les
jetons SAML avec la méthode de confirmation des sujets bearer, dans l'étape de
demande du jeton SAML à un STS externe, spécifiez la méthode de confirmation
Bearer au lieu de
sender-vouches. Par exemple :
//Demande du jeton SAML à un STS externe
WSSFactory factory = WSSFactory.getInstance();
String STS_URI = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext();
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "Bearer");
SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
// Ajout de UNT à la demande sécurisée
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
gencont1.add(ut);
cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
System.out.println("SAMLToken id = " + samlToken.getId());
En
outre, l'étape de configuration de la vérification de la signature numérique
dans le message de réponse est facultative dans le cas du jeton bearer.
Exemple
Le modèle de code qui suit est une application de client de
services Web qui illustre la manière de demander un jeton SAML à un STS externe
et de l'envoyer dans les messages de demande de services Web. Si votre scénario d'utilisation requiert des jetons SAML, mais ne nécessite pas que l'application les transmette par l'intermédiaire des messages de services Web, n'utilisez que la première partie du modèle de code, jusqu'à la section //
Initialiser le client de services Web.
/**
* Le code source qui suit est un exemple de code créé par IBM Corporation.
* Ce code exemple vous est fourni aux seules fins de vous aider
* dans l'utilisation de la technologie. Ce code est livré en l'état sans aucune garantie
* d'aucune sorte. IBM ne sera en aucun cas responsable de tout dommage résultant de l'utilisation de
* cet exemple ce code, même si IBM a été informé de la possibilité de tels dommages.
*/
package com.ibm.was.wssample.sei.cli;
import com.ibm.was.wssample.sei.echo.EchoService12PortProxy;
import com.ibm.was.wssample.sei.echo.EchoStringInput;
import com.ibm.websphere.wssecurity.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.callbackhandler.SAMLGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.UNTGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.saml.config.SamlConstants;
import java.util.Map;
import java.util.HashMap;
import javax.xml.ws.BindingProvider;
/**
* Modèle de client
* point d'entrée principal du modèle de fichier JAR du client léger
* pour la communication avec les services
*/
public class SampleClient {
private String urlHost = "localhost";
private String urlPort = "9443";
private static final String CONTEXT_BASE = "/WSSampleSei/";
private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";
private String message = "HELLO";
private String uriString = "https://" + urlHost + ":" + urlPort;
private String endpointURL = uriString + ECHO_CONTEXT12;
private String input = message;
/**
* main()
*
* voir printusage() pour les arguments de ligne de commande
*
* @param args
*/
public static void main(String[] args) {
SampleClient sample = new SampleClient();
sample.CallService();
}
/**
* Les paramètres CallService ont déjà été lus. Appeler les classes de proxy de service
*
*/
void CallService() {
String response = "ERROR!:";
try {
System.setProperty("java.security.auth.login.config", "racine_profil/properties/wsjaas_client.conf ");
System.setProperty("com.ibm.SSL.ConfigURL", "file:racine_profil/properties/ssl.client.props");
//Demande du jeton SAML à un STS externe
WSSFactory factory = WSSFactory.getInstance();
String STS_URI = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext();
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "Bearer");
SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
// Ajout de UNT à la demande sécurisée
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
gencont1.add(ut);
cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
System.out.println("SAMLToken id = " + samlToken.getId());
// Initialiser le client de services Web
EchoService12PortProxy echo = new EchoService12PortProxy();
echo._getDescriptor().setEndpoint(endpointURL);
// Configurer les propriétés SOAPAction
BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
Map<String, Object> requestContext = bp.getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
// Initialiser WSSGenerationContext
WSSGenerationContext gencont = factory.newWSSGenerationContext();
gencont.add(samlToken);
// Ajouter l'horodatage
WSSTimestamp timestamp = factory.newWSSTimestamp();
gencont.add(timestamp);
gencont.process(requestContext);
// Générer l'objet d'entrée
EchoStringInput echoParm =
new com.ibm.was.wssample.sei.echo.ObjectFactory().createEchoStringInput();
echoParm.setEchoInput(input);
System.out.println(">> CLIENT: SEI Echo to " + endpointURL);
// Préparer la consommation de l'horodatage dans le message de réponse
WSSConsumingContext concont = factory.newWSSConsumingContext();
concont.add(WSSConsumingContext.TIMESTAMP);
concont.process(requestContext);
// Appeler le service
response = echo.echoOperation(echoParm).getEchoResponse();
System.out.println(">> CLIENT: SEI Echo invocation complete.");
System.out.println(">> CLIENT: SEI Echo response is: " + response);
} catch (Exception e) {
System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION.");
e.printStackTrace();
}
}
}
Lorsque ce modèle d'application client de services Web fonctionne correctement, vous recevez des messages du type :
SAMLToken id = _191EBC44865015D9AB1270745072344
Retrieving document at 'file:racine_profil/.../wsdl/'.
>> CLIENT: SEI Echo to https://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO