首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法正确部署Security示例应用程序

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

Stack Overflow用户
提问于 2015-03-23 12:01:19
回答 1查看 2.3K关注 0票数 3

我正在尝试部署Security扩展的一部分示例应用程序,使用SSOCircle作为IDP,但我遇到了许多问题。我真的很希望有人帮我解决这个问题。

这就是我所做的。

我从: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,点击了元数据管理,点击了Login按钮,但是我一直在重定向回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,我现在可以单击Generate新的服务提供者元数据按钮。我为实体ID输入了一个值,接受了其余选项的默认值,并单击了生成元数据。我按照指示将SP元数据文件保存到/WEB-INF/classes/metadata/serverId_sp.xml,并将SP配置数据添加到securityContext.xml中的metadata bean中。我登录到https://idp.ssocircle.com/sso并注册了SP元数据。然后,我注释掉了这两次出现的情况:

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

securityContext.xml中重新启动应用程序。

在主页上,我选择了http://idp.ssocircle.com选项,并单击了Start单点登录。我被正确地重定向到SSOCircle;我输入了用户名和密码,并被重定向回2样例应用程序,但是显示了以下错误:

代码语言:javascript
复制
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与WSO2标识服务器的集成,SAML消息ID未重新定义)是相关的,因为我使用SSOCircle作为我的IDP;也就是说,我的SP和IDP的域是不同的。

Spring文档中的关于故障排除的一节提供了一种通过修改securityContext.xml中的contextProvider bean来禁用检查securityContext.xml设置的方法。我实现了这个修复,并再次重新启动了测试应用程序。

我可以像以前一样通过SSOCircle登录,但是现在当我被重定向回spring-security-saml2 2样例时,我总是被重定向回http://server:8550/spring-security-saml2-sample/saml/discovery?entityID=serverId&returnIDParam=idp;也就是说,没有显示登录用户的详细信息(如http://saml-federation.appspot.com/的在线演示版本),而且我从未看到全局注销 Logout按钮。即使我在浏览器中显式地输入了URL http://server:8550/spring-security-saml2-sample,我也总是被重定向回http://server:8550/spring-security-saml2-sample/saml/discovery?entityID=serverId&returnIDParam=idp

由于我正在将示例应用程序部署到Tomcat的一个独立实例中,所以我还进行了这个答案中建议的更改:Tomcat上的Spring安全SAML元数据URL。然而,这种行为仍然是一样的。

所以,这就是我现在被困的地方。知道是什么导致了我的问题吗?为什么我的示例应用程序的版本与在线演示版本没有相同的行为?

任何帮助都将受到感谢--谢谢。

更新

网络流量的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

EN

回答 1

Stack Overflow用户

发布于 2015-04-03 10:40:19

您正在使用的示例,我也使用了相同的,其工作正常。唯一的问题是您必须了解Spring是如何工作的。

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

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

  1. 将生成的元数据XML内容复制并替换为/WEB- INF/classes/元数据/serverId_sp.xml。
  2. 去解决和注册元数据,并确保您输入正确的实体id,它将在生成的元数据中,像这个entityID=“您的实体id".use一样。
  3. 现在运行应用程序并登录,您将被正确地重定向到包含用户详细信息的主页。

你的问题是元数据。IDP使用SP元数据信息将用户重定向回SP,因此如果您在重定向中有prob,那么SP元数据中就有一个prob。

您是否可以将所生成的元数据发布,以便便于检查。

下面是我使用过的演示应用程序。按照上面的指示去做,你会成功的。https://dl.dropboxusercontent.com/u/23694298/spring-saml-sso-sample.rar

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29209694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档