无法正确部署Spring Security SAML示例应用程序

时间:2015-03-23 12:01:19

标签: tomcat spring-security spring-saml

我尝试使用SSOCircle作为IDP部署示例应用程序,该应用程序是Spring Security SAML扩展的一部分,但我遇到了许多问题。我真的很感激帮助解决这个问题。

这就是我所做的。

我从https://github.com/spring-projects/spring-security-saml/tree/1.0.0.RELEASE下载了源代码,并通过以下代码构建了示例应用程序:mvn package。然后,我将WAR文件部署到Tomcat的独立实例(v7.0.41)。

我推出了应用:http://server:8550/spring-security-saml2-sample, 点击元数据管理,然后点击登录按钮,但我一直重定向回http://server:8550/spring-security-saml2-sample/saml/web/metadata/login

我通过更改以下行来绕过元数据管理登录:

<security:intercept-url pattern="/saml/web/**" access="ROLE_ADMIN"/>

在securityContext.xml中:

<security:intercept-url pattern="/saml/web/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

导航回http://server:8550/spring-security-saml2-sample/saml/web/metadata,我现在可以点击生成新的服务提供商元数据按钮。我输入了实体ID 的值,其余选项的默认值已接受,并点击了生成元数据。 我按照指示将SP元数据文件保存到/WEB-INF/classes/metadata/serverId_sp.xml,并将SP配置数据添加到metadata中的securityContext.xml bean。 我登录到https://idp.ssocircle.com/sso并注册了SP元数据。 然后我注释掉了这两行:

<security:custom-filter before="FIRST" ref="metadataGeneratorFilter"/>

securityContext.xml中,然后重新启动了应用程序。

在主页上,我选择了http://idp.ssocircle.com选项,然后点击开始单点登录。我被正确地重定向到SSOCircle;我输入了我的用户名&amp;密码,并被重定向回spring-security-saml2-sample应用程序,但显示以下错误:

org.springframework.security.authentication.AuthenticationServiceException: Error validating SAML message
at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:95)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
at org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:84)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:195)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:166)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: org.opensaml.common.SAMLException: InResponseToField of the Response doesn't correspond to sent message a2ei6e3068d8fi72g4a0fcc1j41142
at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:139)
at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:82)
... 29 more

关于这个具体问题,我不认为这个答案(Spring SAML integration with WSO2 Identity server, SAML Message ID not reconised)是相关的,因为我使用SSOCircle作为我的IDP;即我的SP和IDP的域名不同。

Spring SAML文档中的section on troubleshooting提供了一种通过修改InResponseToField中的contextProvider bean来禁用检查securityContext.xml设置的方法。 我实现了此修复程序,并再次重新启动了测试应用程序。

我可以像以前一样通过SSOCircle登录,但现在当我重定向回spring-security-saml2-sample时,我总是被重定向回http://server:8550/spring-security-saml2-sample/saml/discovery?entityID=serverId&returnIDParam=idp;即,未显示登录用户的详细信息(如http://saml-federation.appspot.com/中的在线演示版),我从未看到全局注销本地注销纽扣。即使我在浏览器中明确输入了网址http://server:8550/spring-security-saml2-sample,我也会始终重定向回http://server:8550/spring-security-saml2-sample/saml/discovery?entityID=serverId&returnIDParam=idp

由于我将示例应用程序部署到Tomcat的独立实例,因此我还在此答案中建议了更改:Spring Security SAML Metadata URL on Tomcat。但是,行为仍然是相同的。

所以,这就是我现在被困住的地方。什么可能导致我的问题?为什么我的示例应用程序版本的行为与在线演示版本的行为方式相同?

感谢您的任何帮助 - 谢谢。

更新

网络流量的HAR文件位于:http://pastebin.com/EUPHA4gE

stdout的调试输出很长;我把它分成两部分:

第一部分:http://pastebin.com/TkZS7uZM

第二部分:http://pastebin.com/mrRkLs2T

我还发布了Tomcat访问日志,如果这是帮助:http://pastebin.com/992btULh

更新2

更新的网络流量的HAR文件位于:http://pastebin.com/EUPHA4gE

我部署的原始 war文件(在进行上述任何更改之前)在此处:https://dl.dropboxusercontent.com/u/18025575/spring-security-saml2-sample.war

如上所述,包含对各种文件的配置更改的war文件位于:https://dl.dropboxusercontent.com/u/18025575/spring-security-saml2-sample-with-changes.war

1 个答案:

答案 0 :(得分:2)

您正在使用的样本,我也使用了相同的,并且它正常工作。唯一的问题是你必须了解Spring SAML的工作原理。

非常简单。 1.将示例应用程序作为一个新项目部署到tomcat中。(不要做任何更改)。

2.运行应用程序并使用路径(/ saml / metadata)下载默认元数据。   恩。如果您的服务器是localhost:8080 / samlApplication       那么完整路径将是localhost:8080 / samlApplication / saml / metadata       注意:samlApplication将是您的应用程序名称。

  1. 将生成的元数据XML内容复制并替换为/ WEB-
    INF /类/元数据/ serverId_sp.xml。

  2. 转到ssocircle并注册元数据并确保输入正确的实体ID,它将在生成的元数据中,如此entityID =&#34;您的权利ID&#34;。使用相同的。

  3. 现在运行应用程序并登录,您将被正确地重定向到包含用户详细信息的主页。

  4. 您的问题出在元数据中。 IDP使用SP元数据信息将用户重定向回SP,因此如果您在重定向中遇到问题,那么确定SP元数据中存在问题。

    并且您可以发布您生成的元数据,以便检查。

    这是我使用过的演示应用程序。 按照上面的说明,尝试你将成功。 https://dl.dropboxusercontent.com/u/23694298/spring-saml-sso-sample.rar