修改
所以,我想我差不多了。唯一遗漏的是Shibboleth IdP返回一个加密的,瞬态的NameId,我需要它来返回未加密的用户名。如果有人能让我通过这最后一个拦截器,我会标记答案。
(编辑结束)
我一直在尝试设置Shibboleth 3 IdP(我们的应用程序支持SAML,我们需要一个测试环境)。
我的目标是查询LDAP目录以提供身份验证的简单环境。
我设置了Shibboleth IdP 3,它似乎正确地查询AD,但我很难让它返回我请求的属性(uid,名字,姓氏,电子邮件)。
我很确定我的问题出在我的attribute-resolver.xml和attribute-filter.xml文件中,但我没有运气好运。
基本上发生的事情是我成功登录(就Shibboleth而言),但是当它将Assertion传递回我的应用程序时,没有任何属性存在。
我尝试将它们添加到Attribute-resolver.xml和attribute-filter.xml,但后来我在idp-warn.log(下面)中出现错误。这是凭据错误。我很确定用户名密码是正确的,因为shibboleth能够验证我(如果错误会失败,不是吗?)所以我的设置肯定会出现其他问题。
我也尝试在断言名称标识符中返回用户名,但我似乎回来的只是一个base-64编码的字符串(解码它产生的字节不能解码回字符串,所以我不是确定那里有什么。)
此时,我真的可以使用对使用LDAP设置Shibboleth IdP 3的良好操作方法的引用。我一直在网上浏览他们的文档,虽然那里有很多原始数据,但要获得必须完成的所有内容列表才能使其运行起来非常具有挑战性。有什么建议吗?
答案 0 :(得分:0)
不是完整的答案,我没有使用shibboleth,但是在设置SAML时我们遇到了与NameID相同的问题。
我相信此页面显示热门设置了shibboleth将发送的名称:https://wiki.shibboleth.net/confluence/display/SHIB2/ResolverSAML2NameIDAttributeDefinition
此答案描述了不同名称方案的含义https://stackoverflow.com/a/21682789/143585
我们所做的是在SAMLAuthenticationProvider
的saml配置中我们添加了userDetails,并且有一段我非常自豪的代码:
@Override
public Object loadUserBySAML(SAMLCredential credential) throws UsernameNotFoundException {
try {
String login = credential.getAttributeByName("login").getAttributeValues().get(0).getDOM().getFirstChild().getNodeValue();
return loadUserByUsername(login);
} catch (Exception e) {
LOG.error("could not get login name from saml credential", e);
throw new UsernameNotFoundException("Could not load user", e);
}
}
idp的东西是由第三方处理的,所以我猜是他们将这个自定义属性添加到saml响应中。我想你可以配置shibboleth来做同样的事情。