【发布时间】:2016-01-19 21:50:48
【问题描述】:
我能够成功设置 websphere 以通过 IdP 进行身份验证并按预期访问 Web 资源。但现在我的应用程序需要 SAML 令牌/响应中可用的声明/断言/属性才能继续进行。在我的 java 应用程序中访问 SAML 响应/属性的最佳选择是什么?
【问题讨论】:
标签: java websphere saml websphere-7 websphere-8
我能够成功设置 websphere 以通过 IdP 进行身份验证并按预期访问 Web 资源。但现在我的应用程序需要 SAML 令牌/响应中可用的声明/断言/属性才能继续进行。在我的 java 应用程序中访问 SAML 响应/属性的最佳选择是什么?
【问题讨论】:
标签: java websphere saml websphere-7 websphere-8
我想补充上一个答案。对于 Websphere Application Server,如果您使用已经可用的 WebsphereSamlSP 应用程序作为 SP,那么您可以在 IBMWebpshereSamlACSListenerServlet 的 handleRedirect() 方法中使用以下代码来获取 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]);
}
}
}
}
【讨论】:
对于 WebSphere Liberty 配置文件:
从 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();
}
您可以从 Saml20Token 获取 com.ibm.websphere.security.saml2.Saml20Attribute 列表
samlToken.getSAMLAttributes();
您还可以从 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();
【讨论】: