Websphere Application Server SAML 令牌处理

Websphere Application Server SAML Token processing

我能够成功设置 websphere 以使用 IdP 进行身份验证并按预期访问 Web 资源。但是现在我的应用程序需要 SAML token/response 中可用的 claims/assertions/attributes 才能继续进行。在我的 java 应用程序中访问 SAML response/attributes 的最佳选项是什么?

对于 WebSphere Liberty 配置文件:

  1. 从 RunAsSubject 获取 com.ibm.websphere.security.saml2.Saml20Token:

    Saml20Token samlToken = null;
    Subject subject = WSSubject.getRunAsSubject();
    Iterator authIterator = subject.getPrivateCredentials(Saml20Token.class).iterator();
    if (authIterator.hasNext()) {
        samlToken = (Saml20Token) authIterator.next();
    }
    
  2. 您可以从 Saml20Token

    获取 com.ibm.websphere.security.saml2.Saml20Attribute 列表

    samlToken.getSAMLAttributes();

  3. 您还可以从 Saml20Token 获得大多数 SAML 断言。例如 samlToken.getSAMLIssuerName();

对于经典 WebSphere:

    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;
                    }
                });
                   SAMLNameID = samlToken.getSAMLNameID();
    List<SAMLAttribute>  attributes = samlToken.getSAMLAttributes();

我想添加到之前的 answer.For Websphere Application Server,如果您正在使用已经可用的 WebsphereSamlSP 应用程序作为 SP,那么您可以在 handleRedirect() 方法中使用以下代码 IBMWebpshereSamlACSListenerServlet获取 saml 属性。或者在您的自定义 SP 代码中使用它。

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;
                            }
                        });
            // Log attribute name and values
                List<SAMLAttribute> attributes = samlToken.getSAMLAttributes();
                if (attributes != null && !attributes.isEmpty()) {
                    for (SAMLAttribute attr : attributes) {
                        logger.debug(attr.getName());
                        if (attr.getStringAttributeValue() != null) {
                            for (int i = 0; i < attr.getStringAttributeValue().length; i++) {
                                logger.debug(attr.getStringAttributeValue()[i]);
                            }

                        }
                    }
                }