SAML SP和ADFS IdP之间的SSO问题

时间:2016-09-28 15:44:56

标签: spring spring-security saml-2.0 adfs spring-saml

我们正在开发一个Web应用程序,它提供多种登录机制,如LDAP,Kerberos,SAP Logon Ticket以及SAML。

为此我们使用的Spring安全框架(大多数)非常棒!

几个月前,我们为我们的应用程序添加了SAML支持,并使用外部IdP(SSOcircle)对其进行了测试。我们还与SSOcircle的首席执行官密切合作,让我们开始运作。

一切都运转良好,我们认为我们可以与我们的第一个真实客户一起注册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元素必须作为Response中Subject的一部分出现   消息,请在IDP配置中启用它

在排除故障期间,我在StackOverflow上遇到了其他这些线程:

SAMLException: NameID element must be present as part of the Subject in the Response message, please enable it in the IDP configuration

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应该使用的时区?现在,尽管我们的操作系统配置为使用CET / CEST,但祖鲁时间似乎是使用的时区。因此,我们必须使用responseSkew参数进行登录/注销。

EDIT3:Debug&由于我们解决了问题,因此删除了配置

1 个答案:

答案 0 :(得分:2)

好的,我们解决了这个问题。

在实时调试期间,我们注意到NameID是而不是作为SAML断言属性键/值对发送,而是作为SAML断言“标题”中的“独立”键/值对发送。

因此我们修改了代码以涵盖SAML断言中的两个可能位置,现在它可以正常工作。 :d