Selbst ausgestellte SAML-Sender-Vouches-Token über WSS-APIs mit SSL-Transportschutz senden
Sie können selbst ausgestellte SAML-Token mit der Subjektbestätigungsmethode Sender-Vouches erstellen und dann das Programmiermodel JAX-WS (Java™ API for XML-Based Web Services) und WSS-APIs (Web Services Security APIs) nutzen, um diese Token über Web-Service-Anforderungsnachrichten mit Transportschutz zu senden.
Vorbereitende Schritte
Für diese Task müssen Sie mit dem Programmiermodell JAX-WS, den WSS-APIs, mit SAML-Konzepten, mit dem SSL-Transportschutz sowie mit Richtliniensätzen zum Konfigurieren und Verwalten von Web-Service-Einstellungen vertraut sein.
Informationen zu diesem Vorgang
Sie können Ihren Web-Service-Client so erstellen, dass er SAML-Token mit der Subjektbestätigungsmethode Sender-Vouches in SOAP-Anforderungsnachrichten über die Web-Services-Security-Programmierschnittstellen verwendet. Die Verwendung der Programmierschnittstellen im Web-Service-Client für die Angabe der Verwendung von SAML-Token mit Sender-Vouches-Subjektbestätigung und Nachrichtenschutz auf Transportebene ist eine alternative Herangehensweise zur Nutzung von Richtliniensätzen und Bindungskonfigurationen.
Sie können ein selbst ausgestelltes SAML-Token erstellen und dieses dann in Web-Service-Anforderungsnachrichten von einem Web-Service-Client aus senden. Die für diese Task verwendete Web-Service-Clientanwendung ist eine modifizierte Version des Clientcodes in der Beispielanwendung JaxWSServicesSamples, die zum Download verfügbar ist. Im Prozedurenabschnitt sind Codeauszüge des Beispiels beschrieben. Im Abschnitt "Beispiel" finden Sie einen vollständigen, sofort einsatzfähigen Beispiel-Web-Service-Client.
Vorgehensweise
Ergebnisse
Sie haben ein selbst ausgestelltes SAML-Token mit der Bestätigungsmethode Sender-Vouches und Transportschutz erstellt und dieses dann mit Web-Service-Anforderungsnachrichten über das JAX-WS-Programmiermodell und WSS-APIs gesendet.
Beispiel
Das folgende Codebeispiel ist eine vollständige, sofort einsatzfähige Web-Service-Clientanwendung, die veranschaulicht, wie ein selbst ausgestelltes SAML-Sender-Vouches-Token erstellt und in Web-Service-Anforderungsnachrichten gesendet wird. Dieser Beispielcode veranschaulicht die oben beschriebenen Prozedurschritte.
/**
* Der folgende Quellcode ist von der IBM Corporation erstellter Beispielcode, der
* mit der Einschränkung bereitgestellt wird, dass er nur zur Unterstützung für die Nutzung
* der Technologie verwendet werden darf. Der Code wird ohne Wartung (auf "as-is"-Basis) und
* ohne Gewährleistung zur Verfügung gestellt. IBM ist nicht haftbar für Schäden, die Ihnen aus
* der Nutzung des Beispielcodes entstehen, selbst wenn IBM auf die Möglichkeit solche
* Schäden hingewiesen wurde.
*/
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.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;
public class SampleSamlSVClient {
private String urlHost = "localhost";
private String urlPort = "9081";
private static final String CONTEXT_BASE = "/WSSampleSei/";
private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";
private String message = "HELLO";
private String uriString = "http://" + urlHost + ":" + urlPort;
private String endpointURL = uriString + ECHO_CONTEXT12;
private String input = message;
/**
* main()
*
* Befehlszeilenargumente siehe printusage()
*
* @param args
*/
public static void main(String[] args) {
SampleSamlSVClient sample = new SampleSamlSVClient();
sample.CallService();
}
/**
* CallService-Parameter wurden gelesen. Jetzt können die Serviceproxyklassen aufgerufen werden.
*
*/
void CallService() {
String response = "ERROR!:";
try {
System.setProperty("java.security.auth.login.config", "Profilstammverzeichnis/properties/wsjaas_client.conf ");
// WSSFactory-Objekt initialisieren
WSSFactory factory = WSSFactory.getInstance();
// WSSGenerationContext initialisieren
WSSGenerationContext gencont = factory.newWSSGenerationContext();
// Konfiguration des SAML-Ausstellers über angepasste Eigenschaften initialisieren
HashMap<Object, Object> customProps = new HashMap<Object,Object>();
customProps.put(SamlConstants.ISSUER_URI_PROP, "example.com");
customProps.put(SamlConstants.TTL_PROP, "3600000");
customProps.put(SamlConstants.KS_PATH_PROP, "keystores/saml-provider.jceks");
customProps.put(SamlConstants.KS_TYPE_PROP, "JCEKS");
customProps.put(SamlConstants.KS_PW_PROP, "{xor}LCswLTovPiws");
customProps.put(SamlConstants.KEY_ALIAS_PROP, "samlissuer");
customProps.put(SamlConstants.KEY_NAME_PROP, "CN=SAMLIssuer, O=EXAMPLE");
customProps.put(SamlConstants.KEY_PW_PROP, "{xor}NDomLz4sLA==");
customProps.put(SamlConstants.TS_PATH_PROP, "keystores/saml-provider.jceks");
customProps.put(SamlConstants.TS_TYPE_PROP, "JCEKS");
customProps.put(SamlConstants.TS_PW_PROP, "{xor}LCswLTovPiws");
gencont.add(customProps); // Angepasste Eigenschaften hinzufügen
// SAML-Token erstellen
HashMap<Object, Object> map = new HashMap<Object, Object>();
map.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
map.put(SamlConstants.SIGNATURE_REQUIRED, "true");
SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml");
System.out.println("SAMLToken id = " + samlToken.getId());
// Web-Service-Client initialisieren
EchoService12PortProxy echo = new EchoService12PortProxy();
echo._getDescriptor().setEndpoint(endpointURL);
// SOAPAction-Eigenschaften konfigurieren
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");
gencont.add(samlToken);
// Zeitmarke hinzufügen
WSSTimestamp timestamp = factory.newWSSTimestamp();
gencont.add(timestamp);
gencont.process(requestContext);
// Eingabeobjekt erstellen
EchoStringInput echoParm =
new com.ibm.was.wssample.sei.echo.ObjectFactory().createEchoStringInput();
echoParm.setEchoInput(input);
System.out.println(">> CLIENT: SEI Echo to " + endpointURL);
// Verarbeitung der Zeitmarke in der Antwortnachricht vorbereiten
WSSConsumingContext concont = factory.newWSSConsumingContext();
concont.add(WSSConsumingContext.TIMESTAMP);
concont.process(requestContext);
// Service aufrufen
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();
}
}
}
SAMLToken id = _6CDDF0DBF91C044D211271166233407
Retrieving document at 'file:Profilstammverzeichnis/.../wsdl/'.
>> CLIENT: SEI Echo to http://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO