0

我有一个现有的金融应用程序,它使用 API 网关对基于 Web 的用户进行身份验证。该网关为用户维护一个安全会话,并将 SOAP 调用代理到 ​​WebSphere 框。它将签名的 SAML 断言添加到这些 SOAP 调用中。

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

新的需求现在要求我们将 API 网关中的 sessionId 一直传播到 WebSphere 以及其他地方。这是出于可追溯性的原因。

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

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

有人做过吗?

4

2 回答 2

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();
于 2019-06-18T18:15:36.480 回答
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。

于 2019-06-20T20:24:15.810 回答