WS-Trust 클라이언트 API

WS-Trust 클라이언트 API(Application Programming Interface)는 WSSTrustClient 클래스, WSSTrustClientValidateResult 클래스 및 기타 구성 유틸리티 클래스를 포함합니다. WSSTrustClient 클래스는 보안 토큰 서비스(STS)가 하나 이상의 SAML 어설션 및 다른 유형의 보안 토큰을 발행하거나 유효성 검증할 수 있도록 WS-Trust SOAP 요청을 지정된 외부 STS로 전송하는 헬퍼 기능을 제공합니다.

개요

WebSphere® Application Server은 WS-Trust SOAP 요청을 지정된 외부 보안 토큰 서비스(STS)로 전송하고 WSSTrustClient 클래스를 통해 구현되는 WS-Trust 클라이언트 기능을 포함합니다. 신뢰 요청을 사용하여 STS가 하나 이상의 SAML 어설션이나 다른 유형의 보안 토큰을 발행할 수 있습니다. WSSTrustClient 클래스는 OASIS WS-Trust 버전 1.3 스펙 및 WS-Trust 버전 1.2 스펙을 지원합니다. 또한 SOAP 버전 1.1 및 SOAP 버전 1.2 스펙이 기능에 의해 지원됩니다.

뒤에 오는 샘플 코드는 웹 서비스 클라이언트가 WSSTrustClient API를 사용하여 SAML bearer 토큰을 요청하는 방법을 보여줍니다. 코드 샘플 앞에 있는 설명식 텍스트에서, SAML 토큰이라는 용어는 SAML 어설션 용어로 바꿔서 사용됩니다.

WSSTrustClient 클래스

샘플 코드를 Rational® Application Developer 같은 어셈블리 도구 애플리케이션에 복사하고 구성 단계를 완료한 후 해당 코드를 사용하여 시작할 수 있습니다. 유용한 SAML 기능을 빌드하려면 WSSTrustClient 클래스를 다른 SAML API와 함께 사용하십시오. 자세한 정보는 SAML API Javadoc를 참조하십시오.

WSSTrustClient 클래스는 추상 클래스이며 WS-Trust 버전 1.3 구현과 WS-Trust v1.2 구현의 두 가지 구체적 구현을 갖고 있습니다. 코드 샘플의 행 50에서, SAMLWSTrustClientExample 웹 서비스 클라이언트 코드가 WSSTrustClient.getInstance(ProviderConfig) 메소드를 호출하여 WS-Trust v1.3 구현을 검색합니다. getInstance() 메소드는 단일 ProviderConfig 오브젝트를 갖는데, 이것은 SAML 토큰 발행자와 관련된 구성 데이터를 지정합니다. ProviderConfig 오브젝트는 또한 행 32의 샘플 코드에서 구체화됩니다. 클라이언트 코드는 WS-Trust 버전 1.3 요청 메시지를 대상 STS 엔드포인트로 전송합니다. 샘플에서 엔드포인트는 https://MyCompany/Trust/13/UsernameMixed입니다. 샘플 코드를 사용하려면 이 예제 STS 엔드포인트를 사용자가 사용할 계획인 특정 STS 엔드포인트로 대체하십시오.

참고: WebSphere Application Server 릴리스 8부터 WSS(Web Services Security) API(Application Programming Interface)에서 com.ibm.websphere.wssecurity.wssapi.token.SAMLToken 클래스를 사용할 수 있습니다. 혼동할 우려가 없으면 전체 패키지 이름 대신 SAMLToken 용어를 사용합니다. WSS API를 사용하여 외부 STS(Security Token Service)에서 SAMLToken 처리를 요청하고 SOAP 요청 메시지의 SAMLToken을 전파하며, SAMLToken이 식별한 대칭 또는 비대칭 키를 사용하여 SOAP 메시지를 보호할 수 있습니다.

WSS API SAML 지원은 com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactorycom.ibm.websphere.wssecurity.wssapi.trust.WSSTrustClient 인터페이스를 보완합니다. SAMLTokenFactoryWSSTrustClient 인터페이스는 com.ibm.websphere.wssecurity.wssapi.WSSFactory newSecurityToken() 메소드를 사용하여 생성된 SAMLToken을 처리할 수 있습니다. 반대로, SAMLTokenFactory를 통해 생성되거나 WSSTrustClient가 리턴한 SAMLToken을 WSS API에서 사용할 수 있습니다. 애플리케이션에서 사용할 API를 결정하는 것은 사용자의 특정 요구에 따라 다릅니다. WSS API SAML 지원은 웹 서비스 클라이언트 애플리케이션에 관한 한 SAMLTokenFactoryWSSTrustClient 인터페이스의 기능과 같은 기능을 제공한다는 의미에서 독립적입니다. SAMLTokenFactory 인터페이스에는 SAMLToken을 유효성 검증하고 인증된 SAMLToken을 나타내는 JAAS 주제를 작성할 수 있는 추가 기능이 있습니다. 이 유효성 검증은 웹 서비스 제공자 측에 유용합니다. SAMLToken을 이용할 애플리케이션을 개발하는 경우에는 SAMLTokenFactory 프로그래밍 인터페이스가 더 적합합니다.

예: WSSTrustClient 클래스를 사용하는 웹 서비스 클라이언트

1.  package sample;
2.  
3.   import com.ibm.websphere.wssecurity.wssapi.WSSException;
4.   import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
5.   import com.ibm.websphere.wssecurity.wssapi.trust.WSSTrustClient;
6.   import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
7.   import com.ibm.websphere.wssecurity.wssapi.XMLStructure;
8.
9.
10.  import com.ibm.wsspi.wssecurity.core.token.config.RequesterConfiguration;
11.  import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants.Namespace;
12.  import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants.TokenType;
13.  import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants.WST13;
14.  import com.ibm.wsspi.wssecurity.trust.config.ProviderConfig;
15.  import com.ibm.wsspi.wssecurity.trust.config.RequesterConfig;
16.  import com.ibm.wsspi.wssecurity.wssapi.OMStructure;
17.
18.  import org.apache.axiom.om.OMElement;
19.  import org.apache.axis2.util.XMLPrettyPrinter;
20.
21.  import java.util.List;
22.  import java.io.ByteArrayOutputStream;
23.  import java.io.InputStream;
24.  import java.io.BufferedReader;
25.  import java.io.InputStreamReader;
26.  import java.io.IOException;
27.
28.  public class WSSTrustClientExample {
29.
30.    public static void main(String[] args) {
31.          try {
32.          ProviderConfig providerConfig = WSSTrustClient.newProviderConfig(Namespace.WST13, https://MyCompany.com/Trust/13/UsernameMixed );
33.
34.          showProviderConfigDefaultValue(providerConfig);
35.
36.          providerConfig.setPolicySetName("Username WSHTTPS default");
37.          providerConfig.setBindingName("SamlTCSample");
38.          providerConfig.setBindingScope("domain");
39.
40.
41.          RequesterConfig requesterConfig = WSSTrustClient.newRequesterConfig(Namespace.WST13);
42.
43.          showRequestConfigDefaultValue(requesterConfig);
44.
45.          requesterConfig.put(RequesterConfiguration.RSTT.APPLIESTO_ADDRESS, "https://user.MyCompany:9443/WSSampleSei/EchoService12");
46.          requesterConfig.put(RequesterConfiguration.RSTT.TOKENTYPE, TokenType.SAML11);
47.          requesterConfig.put(RequesterConfiguration.RSTT.KEYTYPE, WST13.KEYTYPE_BEARER);
48.          requesterConfig.setSOAPNamespace(Namespace.SOAP12);
49.
50.          WSSTrustClient client = WSSTrustClient.getInstance(providerConfig);
51.          List<SecurityToken> securityTokens = client.issue(providerConfig, requesterConfig);
52.
53.          // Process SAML token
54.          if (securityTokens != null && !securityTokens.isEmpty()) {
55.            System.out.println("Number of tokens returned = " + securityTokens.size());
56.            SecurityToken token = securityTokens.get(0);
57.            if (token instanceof SAMLToken) {            
58.              showSAMLToken((SAMLToken)token);
59.            } else {
60.              System.out.println("Returned token is not an SAMLToken");
61.            }
62.          } else {
63.            System.out.println("No securityToken obtained.");
64.          }
65.
66.      } catch (SoapSecurityException ex) {
67.        System.out.println("Caught exception: " + ex.getMessage());
68.        ex.printStackTrace();
69.      }
70.    }
71.
72.    private static void showProviderConfigDefaultValue(ProviderConfig providerConfig) {
73.      System.out.println("providerConfig.getApplicationName() = " + providerConfig.getApplicationName());
74.      System.out.println("providerConfig.getBindingName() = " + providerConfig.getBindingName());
75.      System.out.println("ProviderConfig.getBindingScope() = " + providerConfig.getBindingScope());
76.      System.out.println("providerConfig.getIssuerURI() = " + providerConfig.getIssuerURI());
77.
78.      System.out.println("providerConfig.getPolicySetName() = " + providerConfig.getPolicySetName());
79.      System.out.println("ProviderConfig.getPortName() = " + providerConfig.getPortName());
80.      System.out.println("providerConfig.getProvider() = " + providerConfig.getProvider());
81.      System.out.println("ProviderConfig.getServiceName() = " + providerConfig.getServiceName());
82.      System.out.println("providerConfig.getWSTrustNamespace() = " + providerConfig.getWSTrustNamespace());
83.      System.out.println("ProviderConfig.toString() = " + providerConfig.toString());
84.    }
85.
86.    private static void showRequestConfigDefaultValue(RequesterConfig requesterConfig) {
87.      System.out.println("requesterConfig.getRSTTProperties() = " + requesterConfig.getRSTTProperties());
88.      System.out.println("requesterConfig.getSecondaryParameters() = " + requesterConfig.getSecondaryParameters());
89.      System.out.println("requesterConfig.getSOAPNamespace() = " + requesterConfig.getSOAPNamespace());
90.      System.out.println("requesterConfig.getWSAddressingNamespace() = " + requesterConfig.getWSAddressingNamespace());
91.
92.      System.out.println("requesterConfig.getMessageID() = " + requesterConfig.getMessageID());
93.      System.out.println("requesterConfig.toString() = " + requesterConfig.toString());
94.    }
95.
96.    private static void showSAMLToken(SAMLToken samlToken){
97.      System.out.println("samlToken.getAssertionQName() = " + samlToken.getAssertionQName());
98.      System.out.println("samlToken.getAudienceRestriction() = " + samlToken.getAudienceRestriction());
99.      System.out.println("samlToken.getAuthenticationMethod() = " + samlToken.getAuthenticationMethod());
100.     System.out.println("samlToken.getConfirmationMethod() = " + samlToken.getConfirmationMethod());
101.     System.out.println("samlToken.getId() = " + samlToken.getId());
102.     System.out.println("samlToken.getKeyIdentifier() = " + samlToken.getKeyIdentifier());
103.     System.out.println("samlToken.getKeyIdentifierEncodingType() = " + samlToken.getKeyIdentifierEncodingType());
104.     System.out.println("samlToken.getKeyIdentifierValueType() = " + samlToken.getKeyIdentifierValueType());
105.     System.out.println("samlToken.getKeyName() = " + samlToken.getKeyName());
106.     System.out.println("samlToken.getPrincipal() = " + samlToken.getPrincipal());
107.     System.out.println("samlToken.getProperties() = " + samlToken.getProperties());
108.     System.out.println("samlToken.getReferenceURI() = " + samlToken.getReferenceURI());
109.     System.out.println("samlToken.getSAMLAttributes() = " + samlToken.getSAMLAttributes());
110.     System.out.println("samlToken.getSamlCreated() = " + samlToken.getSamlCreated());
111.     System.out.println("samlToken.getSamlExpires() = " + samlToken.getSamlExpires());
112.     System.out.println("samlToken.getSamlID() = " + samlToken.getSamlID());
113.     System.out.println("samlToken.getSAMLIssuerName() = " + samlToken.getSAMLIssuerName());
114.     System.out.println("samlToken.getSAMLNameID() = " + samlToken.getSAMLNameID());
115.     System.out.println("samlToken.getStringAttributes() = " + samlToken.getStringAttributes());
116.     System.out.println("samlToken.getSubjectDNS() = " + samlToken.getSubjectDNS());
117.     System.out.println("samlToken.getSubjectIPAddress() = " + samlToken.getSubjectIPAddress());
118.     System.out.println("samlToken.getThumbprint() = " + samlToken.getThumbprint());
119.     System.out.println("samlToken.getThumbprintEncodingType() = " + samlToken.getThumbprintEncodingType());
120.     System.out.println("samlToken.getThumbprintValueType() = " + samlToken.getThumbprintValueType());
121.     System.out.println("samlToken.getTokenQname() = " + samlToken.getTokenQname());
122.     System.out.println("samlToken.getValueType() = " + samlToken.getValueType());    
123.          
124.    XMLStructure samlXmlStructure = samlToken.getXML();
125.     if (samlXmlStructure != null && samlXmlStructure instanceof OMStructure) {
126.     OMStructure samlOMStructure = (OMStructure) samlXmlStructure;
127.     System.out.println("((OMStructure)samlToken.getXML()).getNode()formatted = " + formatXML(samlOMStructure.getNode()));
128.    }
129.      
130.    try {
131.      InputStream is = samlToken.getXMLInputStream();
132.      if (is != null) {
133.        try {
134.          BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
135.          StringBuilder sb = new StringBuilder();        
136.          String line = null;
137.          while ((line = reader.readLine()) != null) {
138.            sb.append(line + "\n");            
139.          } 
140.          System.out.println(sb.toString()); 
141.        } catch (Exception ex) {
142.          System.out.println("Caught exception reading from InputStream: " + ex.getMessage());
143.          ex.printStackTrace();
144.        } finally {
145.          try {
146.            is.close();            
147.          } catch (IOException e) {
148.            e.printStackTrace();
149.          }  
150.        } 
151.      }
152.    } catch (WSSException wex) {
153.      System.out.println("Caught exception getXMLInputStream(): " + wex.getMessage());
154.      wex.printStackTrace();
155.    }
156.  }  
157.
158.  private static String formatXML(OMElement omInput) {
159.    ByteArrayOutputStream out = new ByteArrayOutputStream ();
160.    String output = "";
161.
162.    try {
163.          XMLPrettyPrinter.prettify(omInput, out);
164.          output = out.toString();
165.    } catch (Throwable e) {
166.        try {
167.            output = omInput.toString();
168.        } catch (Throwable e2) {
169.                System.out.println("Caught exception: " + e2.getMessage());
170.        e2.printStackTrace();
171.        }
172.        }
173.    return output;
174.  }
175.
176.  }

정책 세트 및 바인딩에 대한 WSSTrustClient 클래스 지원

WS-Trust 클라이언트 기능은 신뢰 클라이언트 정책 세트 및 바인딩 문서와 함께 사용하기 위한 애플리케이션 특정 바인딩과 일반 바인딩을 둘 다 지원합니다. 또한 일반 바인딩과 기본 바인딩은 애플리케이션이 애플리케이션 서버 환경에서 실행 중인 경우에 지원됩니다. 일반 바인딩은 씬 클라이언트 환경에서 지원되지만 기본 바인딩은 지원되지 않습니다.

WS-Trust 클라이언트 API를 위한 정책 세트 및 바인딩 관리는 웹 서비스 클라이언트를 위한 정책 세트 및 바인딩 관리와 비슷합니다. 그러나, WS-Trust 클라이언트에 고유한 차이가 존재합니다. 한 가지 차이는 WS-Trust 클라이언트가 정책 세트 첨부 파일을 사용하지 않는다는 점입니다. 대신, 정책 세트 이름과 바인딩 이름이 샘플 코드의 행 36 및 행 37에 표시된 것처럼 ProviderConfig 오브젝트에서 지정됩니다.

WS-Trust 클라이언트가 바인딩을 찾을 때, 클라이언트가 검색 범위를 관리하는 방법이 웹 서비스 클라이언트와 다릅니다. 신뢰 클라이언트 바인딩을 위한 wstrustClientBindingScope 특성을 지정하지 않는 경우, 시스템은 먼저 사용자가 지정한 바인딩 이름을 갖는 애플리케이션 특정 바인딩에 대한 애플리케이션을 검색합니다. 바인딩이 발견되면 해당 바인딩이 신뢰 클라이언트 요청에 사용됩니다. 애플리케이션 특정 바인딩이 없는 경우 시스템은 사용자가 지정한 이름을 갖는 바인딩에 대해 사용 가능한 일반 바인딩을 검색합니다. 일반 바인딩이 있는 경우 신뢰 클라이언트 요청에 사용됩니다. 특정 이름을 갖는 바인딩이 없는 경우, 기본 바인딩이 서버 환경에서 사용됩니다. 기본 바인딩은 서버 환경에서만 사용됩니다. 바인딩 범위가 지정된 경우 해당 범위만 바인딩 검색에 사용됩니다.

샘플 코드의 행 38, providerConfig.setBindingScope("domain")은 예제가 일반 바인딩을 사용함을 표시합니다. 또한 바인딩 범위를 application으로 설정하여 샘플 코드가 애플리케이션 특정 바인딩을 사용함을 표시할 수 있습니다. 예제는 SamlTCSample이라는 일반 바인딩을 사용합니다. 일반 바인딩과 애플리케이션 특정 바인딩이 둘 다 애플리케이션 서버 및 씬 클라이언트 환경에서 지원됩니다. 애플리케이션이 애플리케이션 서버에 설치될 때 SamlTCSample 바인딩 구성에 대한 자세한 정보는 STS와 통신하도록 정책 세트 및 바인딩 구성에 관해 읽으십시오.

샘플 코드의 행 34의 showProviderConfigDefaultValue(providerConfig) 코드는 기본 설정을 보여줍니다. 샘플 코드는 providerConfig의 컨텐츠를 인쇄하는 유틸리티 메소드를 포함합니다.

샘플 코드의 행 51인 List<SecurityToken> securityTokens = client.issue(providerConfig, requesterConfig)는 발행 WS-Trust 요청을 전송합니다. 이 행의 두 번째 매개변수는 RequesterConfig 오브젝트를 지정하며, 이 매개변수는 발행 요청의 컨텐츠를 판별합니다. 행 41의 코드, RequesterConfig requesterConfig = WSSTrustClient.newRequesterConfig(Namespace.WST13)은 WS-Trust 버전 1.3 네임스페이스를 사용하여 신뢰 요청을 구성하는 데 사용되는 RequesterConfig 오브젝트를 인스턴스화합니다. 유틸리티 기능은 행 43 showRequestConfigDefaultValue(requesterConfig)에 표시됩니다. 이 기능은 RequesterConfig 오브젝트의 기본 설정을 표시합니다. 행 45와 48 사이의 코드는 버전 1.1 SAML bearer 토큰을 요청하기 위한 RequesterConfig를 초기화합니다. 이 토큰은 SOAP 1.2 네임스페이스를 사용하여 서비스 엔드포인트에 액세스하는 데 사용됩니다. 예제에서 서비스 엔드포인트는 https://user.MyCompany.com:9443/WSSampleSei/EchoService12입니다.

JVM 인수 지원

샘플 코드를 실행하기 전에 여러 JVM(Java™ Virtual Machine) 인수를 설정해야 합니다. 샘플 코드는 Username WSHTTPS 기본 정책 세트를 구현하는데, 이것은 다음 두 가지 요구사항을 갖습니다. 1) Username 토큰이 STS로 전송됩니다. 2) 메시지는 SSL(Secure Socket Layer)을 사용하여 보호됩니다. 이들 요구사항을 만족하도록 환경을 설정하려면 먼저 신뢰 저장소를 정의하도록 ssl.client.props 파일을 구성하십시오. 단계별 지시사항에 대해서는 관리되지 않은 웹 서비스 JAX-WS 클라이언트 실행에 대해 읽으십시오.

SSL 메시지 보호에 관한 두 번째 요구사항을 만족하려면 STS SSL X.509 인증서의 사본을 확보하여 신뢰 저장소에 삽입하십시오. 이를 수행하려면 "SSL에서 retrieveSigners 명령 사용" 주제의 단계에 따라서 서버간 신뢰를 사용 가능하게 하십시오. 또는, profile_home/properties/ssl.client.props 파일의 com.ibm.ssl.enableSignerExchangePrompt 특성이 true로 설정되는 경우 첫 번째 신뢰 요청을 STS로 전송할 때 STS 인증서를 승인할 수 있습니다. 이 옵션에 대한 자세한 정보는 클라이언트에서 서명자 자동 교환 프롬프트 변경에 대해 읽으십시오.

추가로, 클라이언트 런타임 환경이 Username 토큰 LoginModule JAAS 로그인 구성을 찾을 수 있도록 클라이언트 JAAS 구성 파일을 지정해야 합니다. 다음 코드를 사용하여 매개변수를 지정하십시오. -Djava.security.auth.login.config="%WAS_HOME%\properties\wsjaas_client.conf. 또한 클래스 경로에 씬 클라이언트 jar(예: com.ibm.jaxws.thinclient_9.0.jar)를 포함해야 합니다. 자세한 정보는 관리되지 않은 웹 서비스 JAX-WS 클라이언트 애플리케이션 실행에 대해 읽으십시오.

샘플 코드 실행

샘플 코드 실행에 대한 전제조건은 RequesterConfiguration.RSTT.APPLIESTO_ADDRESS 특성에 의해 정의되는 대로 지정된 웹 서비스에 대한 SAML 1.1 bearer 토큰을 발행하도록 외부 STS 엔드포인트를 설정하는 것입니다.

샘플 코드를 실행하면 예제에서 보는 것처럼 WS-Trust 발행 요청 메시지를 생성합니다.
177.  <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
178.      <soapenv:Header>
179.          <wsa:To xmlns:wsa="http://www.w3.org/2005/08/addressing">https://user.MyCompany.com/Trust/13/UsernameMixed</wsa:To>
180.          <wsa:MessageID xmlns:wsa="http://www.w3.org/2005/08/addressing">urn:uuid:4951B6775950CAC92A1252458259166</wsa:MessageID>
181.          <wsa:Action xmlns:wsa="http://www.w3.org/2005/08/addressing">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</wsa:Action>
182.      </soapenv:Header>
183.      <soapenv:Body>
184.          <wst:RequestSecurityToken xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
185.              <wst:TokenType>http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1</wst:TokenType>
186.              <wst:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</wst:RequestType>
187.              <wst:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</wst:KeyType>
188.              <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
189.                  <wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
190.                      <wsa:Address>https://user.MyCompany.com:9443/WSSampleSei/EchoService12</wsa:Address>
191.                  </wsa:EndpointReference>
192.              </wsp:AppliesTo>
193.          </wst:RequestSecurityToken>
194.      </soapenv:Body>
195.  </soapenv:Envelope>
WS-Trust 요청 메시지를 보려면 클라이언트측 추적을 사용으로 설정해야 합니다. 다음 JVM 특성을 설정하십시오.
  • -DtraceSettingsFile=MyTraceSettings.properties
  • -Djava.util.logging.manager=com.ibm.ws.bootstrap.WsLogManager
  • -Djava.util.logging.configureByServer=true
이들 특성에 대한 자세한 정보는 클라이언트 및 독립형 애플리케이션에 대한 추적 사용에 대해 읽으십시오. JVM 특성 설정 외에, MyTraceSettings.properties 파일에서 추적 설정 com.ibm.ws.wssecurity.*=all=enabled을 지정해야 합니다. 추적 로그 파일에서 Trust Client outgoing request:를 찾으십시오.

SAML 토큰 리턴

샘플 코드의 행 51의 코드 List<SecurityToken> securityTokens = client.issue(providerConfig, requesterConfig)는 WS-Trust 발행 요청이 성공적으로 처리되는 경우 SAML 토큰을 리턴합니다. 행 54와 64 사이의 코드가 리턴되는 SAML 토큰을 처리합니다. 행 58에 표시된 유틸리티 기능 showSAMLToken((SAMLToken)token)은 수신된 SAML 토큰의 컨텐츠를 표시합니다. showSAMLToken() 루틴은 SAML 토큰을 XML 문서로 표시합니다. 이 XML 문서의 예가 샘플 코드의 행 196부터 행 233에서 제공됩니다.
196.  <?xml version="1.0" encoding="UTF-8"?>
197.  <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" 
198.   AssertionID="_f7f65d28-fbb1-4e10-8ddf-f4b6ed0c8277" Issuer="http://MyCompany.com/Trust" 
199.   IssueInstant="2009-09-09T01:04:41.144Z">
200.      <saml:Conditions NotBefore="2009-09-09T01:04:41.141Z" NotOnOrAfter="2009-09-09T11:04:41.141Z">
201.          <saml:AudienceRestrictionCondition>
202.              <saml:Audience>https://user.MyCompany.com:9443/WSSampleSei/EchoService12</saml:Audience>
203.          </saml:AudienceRestrictionCondition>
204.      </saml:Conditions>
205.      <saml:AuthenticationStatement AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password" 
206.       AuthenticationInstant="2009-09-09T01:04:41.131Z">
207.          <saml:Subject>
208.              <saml:SubjectConfirmation>
209.                  <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
210.              </saml:SubjectConfirmation>
211.          </saml:Subject>
212.      </saml:AuthenticationStatement>
213.      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
214.          <ds:SignedInfo>
215.              <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
216.              <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
217.              <ds:Reference URI="#_f7f65d28-fbb1-4e10-8ddf-f4b6ed0c8277">
218.                  <ds:Transforms>
219.                      <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
220.                      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
221.                  </ds:Transforms>
222.                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
223.                  <ds:DigestValue>AQ6e7YQqKgcg/B/ebBj8/DF+uWg=</ds:DigestValue>
224.              </ds:Reference>
225.          </ds:SignedInfo>
226.          <ds:SignatureValue>SuccIOniR . . . . yjTh9iQs=</ds:SignatureValue>
227.          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
228.              <X509Data>
229.                  <X509Certificate>MIIB3zCCAUi . . . . itzymqg3</X509Certificate>
230.              </X509Data>
231.          </KeyInfo>
232.      </ds:Signature>
233.  </saml:Assertion>

주제 유형을 표시하는 아이콘 참조 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rwbs_samltrustclientapi
파일 이름:rwbs_samltrustclientapi.html