Propagation de jetons SAML à l'aide de l'API
La fonction de propagation SAML est utile pour les applications qui interagissent avec plusieurs serveurs. Elle communique les informations du jeton depuis le serveur d'origine vers les autres serveurs en aval.
La programmation programmée des jetons SAML s'effectue par une combinaison de programmation explicite et par l'utilisation de l'environnement d'exécution de sécurité des services Web. Vous pouvez, par exemple, extraire le jeton SAML de l'objet org.apache.axis2.jaxws.BindingProvider. Le jeton est ensuite utilisé pour les appels sortants. Dans cet exemple, la sécurité WebSphere n'étant pas requise, la propagation programmée du jeton SAML vous permet d'exploiter la sécurité SAML au niveau de l'application. En outre, le jeton SAML peut être communiqué en aval avec tout protocole.
Utilisez le modèle de code suivant pour extraire le jeton SAML du côté client après la première demande.
javax.xml.ws.Dispatch dispatch = ...;
dispatch.invoke();
Obtenez un contexte de réponse et extrayez le jeton SAML :Map<String, Object> responseContext = dispatch.getResponseContext();
SAMLToken samlToken =
(SAMLToken ) responseContext.get(com.ibm.wsspi.wssecurity.saml.config.SamlConstants.
SAMLTOKEN_OUT_MESSAGECONTEXT);
Le modèle de code suivant illustre la façon de réutiliser un jeton SAML pour des demandes de services web successives.
javax.xml.ws.Dispatch dispatch = ...;
Le client de services Web utilise ensuite ce code pour transmettre un jeton SAML au gestionnaire de sécurité des Services Web :Map<String, Object> requestContext = dispatch.getRequestContext();
requestContext.put(com.ibm.wsspi.wssecurity.saml.config.SamlConstants.
SAMLTOKEN_IN_MESSAGECONTEXT, samlToken);
Le fournisseur de services web (récepteur) peut utiliser le code suivant pour extraire un jeton SAML à partir d'une demande de services web entrante.
Subject subject = (Subject) context.get(com.ibm.wsspi.wssecurity.core.Constants.WSSECURITY_TOKEN_WSSSUBJECT);
SAMLToken samlToken = null;
try {
samlToken = (SAMLToken) AccessController.doPrivileged(
new java.security.PrivilegedExceptionAction() {
public Object run() throws java.lang.Exception {
final java.util.Iterator authIterator =
subject.getPrivateCredentials(SAMLToken.class).iterator();
if ( authIterator.hasNext() ) {
final SAMLToken token = (SAMLToken)
authIterator.next();
return token;
}
return null;
}
});
} catch (Exception ex) {
// Traitement des erreurs
}
List<SAMLAttribute> allAttributes;
allAttributes = ((SAMLToken) samlToken).getSAMLAttributes();
L'environnement d'exécution du client de services web peut mettre en cache le jeton SAML. Lors des demandes client suivantes à l'intérieur de l'application, l'environnement d'exécution de sécurité récupère le jeton SAML dans le cache pour l'utiliser avec la cible.