我有一个现有的财务应用程序,该应用程序使用API网关来验证基于Web的用户。该网关为用户维护安全会话,并将SOAP调用代理到WebSphere框。它将签名的SAML断言添加到这些SOAP调用中。
一系列JAX-WS服务已部署在WebSphere上,并通过WebSphere策略加以保护以使用SAML断言。然后,将SAML断言中指定的身份和组成员身份传播到服务调用的WebSphere安全上下文。一切工作都很好,所有安全逻辑完全由配置完成。
现在,新要求要求我们将API会话中的sessionId一直传播到WebSphere以及以后。这是出于可追溯性的原因。
很明显,我们可以将所有服务的WSDL更改为包括一些元数据字段,但这是一个很大的更改,并且需要非常广泛的测试。
我希望有一种方法可以将SAML断言中的某些任意属性(除了Identity和groupMembership之外)映射到WebSphere安全上下文。甚至甚至可以访问(通过身份验证的)JAX-WS服务中的SAML XML。
有人这样做吗?
答案 0 :(得分:1)
您可以让API网关将sessionid添加为SAML属性,然后在WebSphere处理SAML之后从Subject中检索该属性。这是处理SAML之后在WebSphere中获取SAML属性的示例代码。
Subject subject = WSSubject.getRunAsSubject();
SAMLToken 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;
}
});
Map<String, String> attributes = samlToken.getStringAttributes();
List<SAMLAttribute> attributes = samlToken.getSAMLAttributes();
答案 1 :(得分:0)
您可以使用WSSUtilFactory API来代替自己遍历证书:https://www.ibm.com/support/knowledgecenter/SSAW57_9.0.0/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/wssecurity/wssapi/WSSUtilFactory.html
假设您使用的是SAML 2.0令牌,则可以执行以下操作:
WSSUtilFactory wssuf = WSSUtilFactory.getInstance();
SAMLToken token = wssuf.getSaml20Token();
getSaml20Token方法已添加到70043、80013、85510和9000中的WSSUtilFactory中。