Security 扩展WebSphereSAML身份传播

Security 扩展WebSphereSAML身份传播,security,websphere,saml,Security,Websphere,Saml,我有一个现有的金融应用程序,它使用API网关对基于web的用户进行身份验证。该网关为用户维护一个安全会话,并代理对WebSphereBox的SOAP调用。它向这些SOAP调用添加了一个有符号的SAML断言 WebSphere上部署了一系列JAX-WS服务,这些服务受到WebSphere策略的保护,以使用SAML断言。SAML断言中指定的标识和组成员身份随后传播到服务调用的WebSphere安全上下文。所有的工作都很好,所有的安全逻辑都是通过配置来完成的 新的需求现在要求我们将API网关中的ses

我有一个现有的金融应用程序,它使用API网关对基于web的用户进行身份验证。该网关为用户维护一个安全会话,并代理对WebSphereBox的SOAP调用。它向这些SOAP调用添加了一个有符号的SAML断言

WebSphere上部署了一系列JAX-WS服务,这些服务受到WebSphere策略的保护,以使用SAML断言。SAML断言中指定的标识和组成员身份随后传播到服务调用的WebSphere安全上下文。所有的工作都很好,所有的安全逻辑都是通过配置来完成的

新的需求现在要求我们将API网关中的sessionId一直传播到WebSphere,甚至更远。这是出于可追溯性的原因

显然,我们可以将所有服务的WSDL更改为包含一些元数据字段,但这是一个很大的更改,需要进行非常广泛的测试

我希望有一种方法可以将一些任意属性从SAML断言(而不是标识和组成员身份)映射到WebSphere安全上下文。甚至可以访问(经过身份验证的)JAX-WS服务中的SAML XML


有人这样做了吗?

您可以让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();
Subject-Subject=WSSubject.getRunAsSubject();
SAMLToken SAMLToken=(SAMLToken)AccessController.doPrivileged(
新java.security.PrivilegedExceptionAction()文件{
public Object run()抛出java.lang.Exception
{
final java.util.Iterator authierator=subject.getPrivateCresidentificates(SAMLToken.class).Iterator();
if(authIterator.hasNext()){
final-SAMLToken标记=(SAMLToken)authierator.next();
返回令牌;
}
返回null;
}
});
Map attributes=samlToken.getStringAttributes();
List attributes=samlToken.getSamlatAttributes();

您可以使用WSSUtilFactory API来完成以下操作,而不是自己循环使用creds:

假设您正在使用SAML 2.0令牌,您可以执行以下操作:

WSSUtilFactory wssuf = WSSUtilFactory.getInstance();
SAMLToken token = wssuf.getSaml20Token();

getSaml20Token方法是在70043、80013、85510和9000年添加到WSSUtilFactory的。

我已经搜索了很长时间-我在任何文档中都找不到SAML属性最终出现在getPrivateCredentials中的任何痕迹:-(我很高兴看到你的帖子(当然也能认出你的名字)明天我将首先在现场尝试这个。干杯!我们正在WebSphere Application server 8.5下使用SCA组件,作为JAX-WS服务提供商公开。上述代码是否仍然有效?我们在WS-Security标头中看到一个saml:属性,但在GetSamlatAttributes()中没有任何内容您是否能够从主题中提取非空的SAMLToken对象?如果能够,并且可以在安全标头中的入站SAML令牌中看到属性,则getSAMLAttributes应该可以工作。如果无法从标头中提取SAML令牌对象,则需要确保您在pro中具有SAML令牌的调用方配置vider bindings。请看@Barbara Jenson现在一切都好了,非常有魅力。非常感谢。