【发布时间】:2017-02-06 16:57:56
【问题描述】:
我们正在开发一个 Web 应用程序,它提供多种登录机制,例如 LDAP、Kerberos、SAP Logon Ticket 以及 SAML。
为此,我们使用 Spring Security Framework,它(大部分)工作得非常好!
几个月前,我们为我们的应用程序添加了 SAML 支持,并使用外部 IdP (SSOcircle) 对其进行了测试。我们还与 SSOcircle 的 CEO 密切合作,以帮助我们启动和运行。
一切正常,我们认为我们可以向我们的第一个真实客户注册 SAML。
所以我们在 linux 机器上设置了一个测试服务器 (SP),并配置了我们的部分(我们使用了这个文档:http://docs.spring.io/spring-security-saml/docs/current/reference/html/chapter-idp-guide.html)并等待我们的客户完成他们的部分。
但是当他们尝试 SSO 进入我们的应用程序(他们使用 ADFS)时,我们遇到了问题。
因为现在,我们会收到两条错误消息中的一条。要么这个
身份验证请求失败: org.springframework.security.core.userdetails.UsernameNotFoundException: 不允许使用空用户名!
或者这个
验证 SAML 消息 org.opensaml.common.SAMLException 时出错: NameID 元素必须作为主题的一部分出现在响应中 消息,请在 IDP 配置中启用它
在故障排除期间,我在 StackOverflow 上遇到了这些其他线程:
Configuring ADFS 3.0 / SAML 2.0 to work with Spring Security for SSO integration
NameID element must be present as part of the Subject
奇怪的是,只有当我们将 adfs 声明规则从“传出声明类型”更改为“传递声明类型”时,才会出现第二条错误消息(关于 nameid)元素。
现在,我不知道从哪里继续进行故障排除。对这个问题有什么想法或想法吗?
最好的问候 勒内
EDIT1:我附上了调试日志文件和我们的 saml 安全配置的链接
EDIT2:有人知道是否有办法指定 SAML 应该使用的时区吗?现在,Zulu 时间似乎是使用的时区,尽管我们的操作系统配置为使用 CET/CEST。因此我们必须使用 responseSkew 参数来登录/注销。
EDIT3:调试和配置已删除,因为我们解决了问题
【问题讨论】:
-
对那个“奇怪的事情”的疯狂猜测:可能是当您更改声明规则类型时,发出映射到 NameId 的声明被过滤掉了,从而停止发出 nameid。
-
谢谢,这是个好主意。在调试过程中我会记住这一点。 :)
标签: spring spring-security saml-2.0 adfs spring-saml