使用 API 传播 SAML 令牌
SAML 传播功能对于跨多个服务器进行交互的应用程序很有用。传播功能将令牌信息从起源服务器向下游传播到其他服务器。
您可以使用管理命令来传播 SAML 令牌,或者使用 SAML 应用程序编程接口 (API) 以编程方式来传播 SAML 令牌。主题“传播 SAML 令牌”和“SAML 令牌传播方法”中描述了通过管理命令进行传播。
SAML 令牌的编程式传播是通过显式编程与使用 Web service 安全性运行时环境进行组合来实现的。 例如,您可以从 org.apache.axis2.jaxws.BindingProvider 对象中抽取 SAML 令牌。然后该令牌用于出站调用。在此示例中,由于不需要 WebSphere® 安全性,因此以编程方式传播 SAML 令牌允许您在应用程序级别开发 SAML 安全性。此外,可以使用任何协议向下游传达 SAML 令牌。
使用以下样本代码在完成第一个请求之后在客户端抽取 SAML 令牌。
创建 Dispatch 对象并调用请求:
javax.xml.ws.Dispatch dispatch = ...;
dispatch.invoke();
获取响应上下文并抽取 SAML 令牌:Map<String, Object> responseContext = dispatch.getResponseContext();
SAMLToken samlToken =
(SAMLToken ) responseContext.get(com.ibm.wsspi.wssecurity.saml.config.SamlConstants.
SAMLTOKEN_OUT_MESSAGECONTEXT);
以下样本代码说明如何对后续 Web service 请求复用 SAML 令牌。
Web service 客户机程序创建一个分派实例以调用服务:
javax.xml.ws.Dispatch dispatch = ...;
Web service 客户机随后使用此代码将 SAML 令牌传递到 Web service 安全处理程序:Map<String, Object> requestContext = dispatch.getRequestContext();
requestContext.put(com.ibm.wsspi.wssecurity.saml.config.SamlConstants.
SAMLTOKEN_IN_MESSAGECONTEXT, samlToken);
Web service 提供程序(接收方)可以使用以下代码从入局 Web service 请求中抽取 SAML 令牌。
从 requestContext 中抽取 SAMLToken:
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) {
// Error handling
}
抽取 SAML 属性:
List<SAMLAttribute> allAttributes;
allAttributes = ((SAMLToken) samlToken).getSAMLAttributes();
Web service 客户机运行时环境可以将 SAML 令牌进行高速缓存。 在应用程序中的后续客户机请求中,安全运行时环境将从高速缓存中检索 SAML 令牌以用于目标。