SAML-Bearer-Token von externem STS über WSS-APIs mit Transportschutz anfordern

Sie können SAML-Token mit der Subjektbestätigungsmethode Bearer von einem externen Sicherheitstokenservice (STS) anfordern. Die angeforderten SAML-Bearer-Token können Sie 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 ein SAML-Token mit der Subjektbestätigungsmethode Bearer von einem externen STS anfordern und dieses dann in Web-Service-Anforderungsnachrichten von einem Web-Service-Client aus über WSS-APIs 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

  1. Ermitteln Sie den Web-Service-Client, mit dem Sie einen Web-Service-Provider aufrufen möchten, und fordern Sie diesen Client an.

    Fügen Sie mit diesem Client über WSS-APIs programmgestützt SAML-Token in SOAP-Anforderungsnachrichten ein.

    Der in dieser Prozedur verwendete Web-Service-Client ist eine modifizierte Version des Clientcodes, der in der Web-Service-Beispielanwendung JaxWSServicesSamples enthalten ist.

    Führen Sie die folgenden Schritte aus, um den Beispiel-Web-Service-Client anzufordern und mit WSS-APIs zu modifizieren, um SAML-Token programmgestützt in SOAP-Anforderungsnachrichten übergeben zu können:

    1. Laden Sie die Beispielanwendung JaxWSServicesSamples herunter. Das Beispiel JaxWSServicesSamples ist standardmäßig nicht installiert.
    2. Fordern Sie den Clientcode für JaxWSServicesSamples an.

      Zu Demonstrationszwecken verwendet diese Prozedur eine modifizierte Version des Thin-Client-Beispiels Echo, das Teil des Beispiels JaxWSServicesSamples ist. Die Datei SampleClient.java des Web Services Thin Client "Echo" befindet sich im Verzeichnis src\SampleClientSei\src\com\ibm\was\wssample\sei\cli. Die Beispielklassendatei ist in der Datei WSSampleClientSei.jar enthalten.

      Die Unternehmensanwendung JaxWSServicesSamples.ear und die unterstützenden JAR-Dateien (Java-Archiv) befinden sich im Verzeichnis installableApps in der Beispielanwendung "JaxWSServicesSamples".

    3. Implementieren Sie die Datei JaxWSServicesSamples.ear auf dem Anwendungsserver. Nachdem Sie die Datei JaxWSServicesSamples.ear implementiert haben, können Sie den Code des Beispiel-Web-Service-Clients anhand der Beispielanwendung testen.

    Anstatt den Beispiel-Web-Service-Client zu verwenden, können Sie auch die Codefragmente hinzufügen, um in Ihrer eigenen Web-Service-Clientanwendung SAML-Token über WSS-APIs programmgestützt in SOAP-Anforderungsnachrichten zu übergeben. Das Beispiel in dieser Prozedur nutzt einen Web Services Thin Client für JAX-WS. Sie können aber auch einen verwalteten Client verwenden.

  2. Ordnen Sie den Standardrichtliniensatz SAML20 Bearer WSHTTPS dem Web-Service-Provider zu. Dieser Richtliniensatz wird verwendet, um Nachrichten mittels HTTPS-Transport zu schützen. Lesen Sie hier, wie die Client- und Providerbindungen für das SAML-Bearer-Token konfiguriert werden, und erfahren Sie, wie der Standardrichtliniensatz SAML20 Bearer WSHTTPS Ihrem Web-Service-Provider zugeordnet wird.
  3. Weisen Sie die allgemeinen Standardbindungen von "SAML Bearer Provider sample" dem Beispiel-Web-Service-Provider zu. Lesen Sie hier, wie die Client- und Providerbindungen für das SAML-Bearer-Token konfiguriert werden, und erfahren Sie, wie die allgemeinen Standardbindungen des SAML-Bearer-Providerbeispiels Ihrer Web-Service-Anwendung zugeordnet werden.
  4. Prüfen Sie, ob die angepassten Eigenschaften trustStoreType, trustStorePassword und trustStorePath dem Truststore mit dem STS-Unterzeichnerzertifikat entsprechen. Führen Sie in der Administrationskonsole die folgenden Schritte aus:
    1. Klicken Sie auf Services > Richtliniensätze > Allgemeine Providerrichtliniensatzbindungen > SAML Bearer Provider sample > WS-Security > Authentifizierung und Zugriffsschutz.
    2. Klicken Sie in der Tabelle mit den Authentifizierungstoken auf gen_saml11token.
    3. Klicken Sie auf Callback-Handler.
    4. Vergewissern Sie sich im Abschnitt "Angepasste Eigenschaften", dass die angepassten Eigenschaften trustStoreType, trustStorePassword und trustStorePath dem Truststore mit dem STS-Unterzeichnerzertifikat entsprechen.
  5. Fordern Sie das SAML-Token von einem externen STS an. Das folgende Codefragment veranschaulicht die Anforderung des SAML-Tokens. Hierbei wird vorausgesetzt, dass ein externer STS so konfiguriert ist, dass er ein Benutzernamenstoken akzeptiert und nach der Validierung ein SAML-2.0-Token ausstellt.
    // SAML-Token von externem STS anfordern
    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);
    
    // UNT zur Trust-Anforderung hinzufügen
    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());
    1. Fügen Sie die JAR-Datei des Thin Client für JAX-WS zum Klassenpfad hinzu. Fügen Sie die Datei Stammverzeichnis_des_Anwendungsservers/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar zum Klassenpfad hinzu. Lesen Sie die Informationen zum Testen von Clients mit Unterstützung für Web Services, um zu erfahren, wie diese JAR-Datei zum Klassenpfad hinzugefügt wird.
    2. Fordern Sie mit der Methode WSSFactory newSecurityToken ein SAML-Token von einem externen STS an.
      Geben Sie folgende Methode an, um das SAML-Token anzufordern:
      WSSFactory  newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
      Das Anfordern eines SAML-Tokens erfordert die Java-Sicherheitsberechtigung wssapi.SAMLTokenFactory.newSAMLToken. Verwenden Sie das Richtlinientool, um zu der Datei mit der Java-Sicherheitsrichtlinie oder der Datei was.policy des Anwendungsclients die folgende Richtlinienanweisung hinzuzufügen:
      permission java.security.SecurityPermission "wssapi.SAMLTokenFactory.newSAMLToken"

      Der Parameter SAMLToken.class gibt den Typ des zu erstellenden Sicherheitstokens an.

      Das Objekt callbackHandler enthält Parameter, die die Merkmale des anzufordernden SAML-Tokens definieren, und weitere Parameter, die erforderlich sind, um den STS zu erreichen und das SAML-Token anzufordern. Das Objekt SAMLGenerateCallbackHandler gibt die in der folgenden Tabelle beschriebenen Konfigurationsparameter an.
      Tabelle 1. Eigenschaften von SAMLGenerateCallbackHandler. In der folgenden Tabelle sind die Konfigurationsparameter für das Objekt SAMLGenerateCallbackHandler bei Verwendung der Bestätigungsmethode Bearer beschrieben.
      Eigenschaft Beschreibung Erforderlich
      SamlConstants.CONFIRMATION_METHOD Gibt an, dass die Bestätigungsmethode Bearer verwendet werden soll Ja
      SamlConstants.TOKEN_TYPE

      Gibt den Tokentyp an

      Wenn einem Web-Service-Client Richtliniensätze zugeordnet sind, wird diese Eigenschaft nicht von der Web-Services-Security-Laufzeit verwendet.

      Geben Sie den Tokenwerttyp mit dem Attribut valueType der tokenGenerator-Bindungskonfiguration an.

      Das Beispiel in dieser Prozedur nutzt ein SAML-2.0-Token. Sie können aber auch den Wert WSSConstants.SAML.SAML11_VALUE_TYPE verwenden.

      Ja
      SamlConstants.STS_ADDRESS

      Gibt die Adresse des Sicherheitstokenservice an

      In der Task in diesem Artikel ist der Wert dieser Eigenschaft beispielsweise auf https gesetzt, um anzugeben, dass die SAML-Tokenanforderung mit SSL geschützt werden soll.

      Sie müssen die Eigenschaft -Dcom.ibm.SSL.ConfigURL setzen, damit SSL verwendet werden kann, um die SAML-Tokenanforderung beim STS zu schützen.

      Ja
      SamlConstants.SAML_APPLIES_TO Gibt die Adresse des Ziel-STS an, an der Sie das SAML-Token verwenden möchten Nein
      SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST Gibt an, ob beim STS ein einzelnes, in einem Element RequestSecurityToken (RST) eingeschlossenes Token angefordert werden soll oder eine Gruppe von RST-Elementen, die in nur einem Element RequestSecurityTokenCollection (RSTC) eingeschlossen sind.

      Standardmäßig wird ein Einzeltoken angefordert, das in einem Element RequestSecurityToken (RST) vom STS eingeschlossen ist.

      Wenn Sie für diese Eigenschaft den Wert true angeben, werden mehrere Token in einer Gruppe von RST-Elementen angefordert, die in einem einzelnen Element RequestSecurityTokenCollection (RSTC) vom STS eingeschlossen ist.

      Nein
      SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE Gibt den in der WS-Trust-Anforderung enthaltenen WS-Trust-Namespace an Nein

      Außerdem werden im Objekt SAMLGenerateCallbackHandler eine WSSGenerationContext-Instanz und eine WSSConsumingContext-Instanz definiert. Die WSSGenerationContext-Instanz muss ein Objekt UNTGenerateCallbackHandler mit Informationen zur Erstellung des Benutzernamenstokens enthalten, das Sie an den STS senden wollen.

      Der Parameter system.wss.generate.saml gibt das für die Erstellung des SAML-Tokens zu verwendende JAAS-Anmeldemodul (Java Authentication and Authorization Service) an. Sie müssen eine JVM-Eigenschaft angeben, um eine JAAS-Konfigurationsdatei mit der erforderlichen JAAS-Anmeldekonfiguration zu definieren. Beispiel:
      -Djava.security.auth.login.config=Profilstammverzeichnis/properties/wsjaas_client.conf 
      Alternativ können Sie eine Java-Systemeigenschaft im Beispielclientcode setzen, um eine JAAS-Anmeldekonfigurationsdatei anzugeben, z. B.
      System.setProperty("java.security.auth.login.config", "Profilstammverzeichnis/properties/wsjaas_client.conf");
    3. Fordern Sie die Token-ID des erstellten SAML-Tokens an.
      Verwenden Sie als einfachen Test für das von Ihnen erstellte SAML-Token die folgende Anweisung:
      System.out.println("SAMLToken id = " + samlToken.getId())
  6. Fügen Sie das SAML-Token zum SOAP-Sicherheitsheader von Web-Service-Anforderungsnachrichten hinzu.
    1. Initialisieren Sie den Web-Service-Client und konfigurieren Sie die SOAPAction-Eigenschaften. Diese Aktionen veranschaulicht das folgende Codefragment:
      // 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");
      			
    2. Initialisieren Sie den WSSGenerationContext. Der folgende Code veranschaulicht die Verwendung der Schnittstelle WSSGenerationContext für die Initialisierung eines Generierungskontexts und für das Einfügen des SAMLToken in eine Web-Service-Anforderungsnachricht.
      // WSSGenerationContext initialisieren
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(samlToken);	
      Speziell der Methodenaufruf gencont.add(samlToken) gibt an, dass das SAML-Token in eine Anforderungsnachricht eingefügt werden soll. Verwenden Sie das Richtlinientool, um zu der Datei mit der Java-Sicherheitsrichtlinie oder der Datei was.policy des Anwendungsclients die folgende Richtlinienanweisung hinzuzufügen:
      permission javax.security.auth.AuthPermission "modifyPrivateCredentials"
    3. Fügen Sie zum Sicherheitsheader von SOAP-Nachrichten das Element timestamp hinzu. Der Standardrichtliniensatz SAML20 Bearer WSHTTPS erfordert, dass Web-Service-Anforderungsnachrichten und -Antwortnachrichten im Sicherheitsheader von SOAP-Nachrichten ein Element timestamp enthalten. Im folgenden Codefragment generiert der Methodenaufruf factory.newWSSTimestamp() die Zeitmarke (timestamp) und der Methodenaufruf gencont.add(timestamp) gibt an, welche Zeitmarke in eine Anforderungsnachricht eingefügt werden soll:
      // Der Anforderungsnachricht eine Zeitmarke hinzufügen.
      WSSTimestamp timestamp = factory.newWSSTimestamp();
      gencont.add(timestamp);
      	        
      gencont.process(requestContext);
    4. Fügen Sie das Objekt WSSGenerationContext zum Web-Service-Objekt RequestContext hinzu. Das Objekt WSSGenerationContext enthält jetzt alle Sicherheitsinformationen, die für das Formatieren einer Anforderungsnachricht erforderlich sind. Der Methodenaufruf gencont.process(requestContext) ordnet das Objekt WSSGenerationContext dem Web-Service-Objekt RequestContext zu, damit die Web-Services-Security-Laufzeitumgebung den erforderlichen SOAP-Sicherheitsheader formatieren kann. Beispiel:
      // Objekt WSSGenerationContext zum Web-Service-Objekt RequestContext hinzufügen
      gencont.process(requestContext);
    5. Geben Sie mit JVM-Nachrichten den Nachrichtenschutz auf SSL-Transportebene an.
      Der Standardrichtliniensatz SAML20 Bearer WSHTTPS erfordert den Nachrichtenschutz auf Transportebene mit SSL. Mit derselben Eigenschaften können Sie den Schutz der SAML-Tokenanforderung an den STS mit SSL aktivieren. Geben Sie mit der folgenden JVM-Eigenschaft den SSL-Nachrichtenschutz auf Transportebene an:
      -Dcom.ibm.SSL.ConfigURL=file:Profilstammverzeichnis\properties\ssl.client.props
      Alternativ können Sie mit einer Java-Systemeigenschaft im Beispielclientcode die SSL-Konfigurationsdatei definieren, z. B.
      System.setProperty("com.ibm.SSL.ConfigURL", "file:Profilstammverzeichnis/properties/ssl.client.props");

Ergebnisse

Sie haben ein SAML-Token mit der Subjektbestätigungsmethode Bearer und Transportschutz von einem externen STS angefordert. Das angeforderte Token haben Sie dann mit Web-Service-Anforderungsnachrichten über das JAX-WS-Programmiermodell und WSS-APIs gesendet.

Wenn Sie ein SAML-Token mit der Subjektbestätigungsmethode Bearer und Nachrichtenschutz von einem externen STS anfordern möchten, lesen Sie in der Dokumentation nach, wie SAML-Sender-Vouches-Token von einem externen STS angefordert und dann über WSS-APIs mit Nachrichtenschutz gesendet werden. Wenn Sie den Nachrichtenschutz für SAML-Token mit der Subjektbestätigungsmethode Bearer verwenden möchten, geben Sie in den Schritt, in dem das SAML-Token von einem externen STS angefordert wird, anstelle der Bestätigungsmethode sender-vouches die Methode Bearer an, z. B.
// SAML-Token von externem STS anfordern
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);

// UNT zur Trust-Anforderung hinzufügen
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());
Im Falle von Bearer-Token ist außerdem das Konfigurieren der Verifizierung der digitalen Signatur in der Antwortnachricht ein optionaler Schritt.

Beispiel

Das folgende Codebeispiel ist eine Web-Service-Clientanwendung, die veranschaulicht, wie ein SAML-Token von einem externen STS angefordert 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.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;

/**
 * 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");

// SAML-Token von externem STS anfordern
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);			


// UNT zur Trust-Anforderung hinzufügen
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());


	        // 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");
			
			// WSSGenerationContext initialisieren
			WSSGenerationContext gencont = factory.newWSSGenerationContext();
	        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();
		}
	}		
}
Wenn diese Beispiel-Web-Service-Clientanwendung ordnungsgemäß ausgeführt wird, empfangen Sie Nachrichten wie die folgenden:
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

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_configsamlbearer_requeststs
Dateiname:twbs_configsamlbearer_requeststs.html