Selbst ausgestellte SAML-Bearer-Token mit WSS-APIs senden
Sie können selbst ausgestellte SAML-Token mit der Subjektbestätigungsmethode Bearer erstellen und diese Token dann in Web-Service-Anforderungsnachrichten über das Programmiermodell Java™ API for XML-Based Web Services (JAX-WS) und WSS-APIs (Web Services Security APIs) senden.
Vorbereitende Schritte
Für diese Task müssen Sie mit dem Programmiermodell JAX-WS, den WSS-APIs, mit SAML-Konzepten 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 Bearer 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 Bearer-Subjektbestätigung 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. Der für diese Task verwendete Web-Service-Anwendungsclient ist eine modifizierte Version des Clientcodes in der Beispielanwendung JaxWSServicesSamples, die zum Download verfügbar ist. Im Prozedurenabschnitt sind Codefragmente 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 mit der Subjektbestätigungsmethode Bearer erstellt und dieses dann mit Web-Service-Anforderungsnachrichten über das JAX-WS-Programmiermodell und WSS-APIs gesendet.
Beispiel
Das folgende Codebeispiel ist eine Web-Service-Clientanwendung, die veranschaulicht, wie ein selbst ausgestelltes SAML-Token erstellt und in Web-Service-Anforderungsnachrichten gesendet wird. Falls Ihr Einsatzszenario SAML-Token erfordert, jedoch nicht die Übergabe der SAML-Token mit Web-Service-Nachrichten durch Ihrer Anwendung, müssen Sie nur den ersten Teil des folgenden Beispielcodes bis einschließlich des Abschnitts // Web-Service-Client initialisieren verwenden.
/**
* 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;
/**
* SampleClient
* Haupteintrittspunkt für das Thin-Client-JAR-Beispiel
* und die Kommunikation der Worker-Klasse mit den 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()
*
* Befehlszeilenargumente siehe printusage()
*
* @param args
*/
public static void main(String[] args) {
SampleClient sample = new SampleClient();
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 ");
System.setProperty("com.ibm.SSL.ConfigURL", "file:Profilstammverzeichnis/properties/ssl.client.props");
// 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, "Bearer");
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 = _191EBC44865015D9AB1270745072344
Retrieving document at 'file:Profilstammverzeichnis/.../wsdl/'.
>> CLIENT: SEI Echo to https://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO