我有一个现有的金融应用程序,它使用API网关来验证基于web的用户。此网关为用户维护一个安全会话,并将SOAP调用代理到一个WebSphere盒。它将一个签名的SAML断言添加到这些SOAP调用中。
在WebSphere上部署了一系列JAX-WS服务,这些服务受到WebSphere策略的保护,以使用SAML断言。然后,将SAML断言中指定的身份和组成员身份传播到服务调用的WebSphere安全上下文。所有的工作都很好,所有的安全逻辑都是完全通过配置来完成的。
新的需求现在要求我们在API网关中将sessionId一直传播到WebSphere,甚至更远。这是出于可追溯性的原因。
显然,我们可以更改所有服务的WSDL以包含一些元数据字段,但这是一个很大的更改,需要非常广泛的测试。
我希望有一种方法可以将SAML断言中的一些任意属性(身份和groupMembership除外)映射到WebSphere安全上下文。甚至访问(经过身份验证的) JAX-WS服务中的SAML XML。
有人这么做过吗?
发布于 2019-06-19 02:15:36
您可以让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();发布于 2019-06-21 04:24:16
您可以使用WSSUtilFactory API为您完成此操作,而不是自己遍历证书:https://www.ibm.com/support/knowledgecenter/SSAW57
假设您使用的是SAML 2.0令牌,则可以执行以下操作:
WSSUtilFactory wssuf = WSSUtilFactory.getInstance();
SAMLToken token = wssuf.getSaml20Token();getSaml20Token方法是在70043、80013、85510和9000年中添加到WSSUtilFactory中的。
https://stackoverflow.com/questions/56634662
复制相似问题