【发布时间】:2016-04-20 04:40:36
【问题描述】:
我正在尝试使用 Spring Security SAML 扩展将 SAML SSO 与 Spring Security 集成。之前,我成功地运行了一个在这里找到的概念证明:https://github.com/vdenotaris/spring-boot-security-saml-sample。不幸的是,将配置移至我的项目后,它无法正常工作。
分析日志后,我发现我的应用程序 (SP) 正在从提供的 URL 正确下载 IdP 元数据。但是,在尝试通过在浏览器中尝试https://localhost:8443/saml/metadata 来下载我的 SP 的元数据后,会引发以下异常:
javax.servlet.ServletException: Error initializing metadata
at org.springframework.security.saml.metadata.MetadataDisplayFilter.processMetadataDisplay(MetadataDisplayFilter.java:120)
at org.springframework.security.saml.metadata.MetadataDisplayFilter.doFilter(MetadataDisplayFilter.java:88)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1645)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:564)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1111)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:498)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1045)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:98)
at org.eclipse.jetty.server.Server.handle(Server.java:461)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:284)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:244)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:534)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.opensaml.saml2.metadata.provider.MetadataProviderException: No hosted service provider is configured and no alias was selected
at org.springframework.security.saml.context.SAMLContextProviderImpl.populateLocalEntity(SAMLContextProviderImpl.java:311)
at org.springframework.security.saml.context.SAMLContextProviderImpl.populateLocalContext(SAMLContextProviderImpl.java:216)
at org.springframework.security.saml.context.SAMLContextProviderImpl.getLocalEntity(SAMLContextProviderImpl.java:107)
at org.springframework.security.saml.metadata.MetadataDisplayFilter.processMetadataDisplay(MetadataDisplayFilter.java:114)
... 24 more
调试后,我无法弄清楚为什么 Spring 无法找出我的应用程序的实体 ID。我是这样设置的:
// Filter automatically generates default SP metadata
@Bean
public MetadataGenerator metadataGenerator() {
MetadataGenerator metadataGenerator = new MetadataGenerator();
metadataGenerator.setEntityId(environment.getRequiredProperty("saml.entity-id"));
metadataGenerator.setEntityBaseURL("URL is here");
metadataGenerator.setExtendedMetadata(extendedMetadata());
metadataGenerator.setIncludeDiscoveryExtension(false);
metadataGenerator.setKeyManager(keyManager());
return metadataGenerator;
}
当然 saml.entity-id 属性是从我的配置中正确下载的。整个安全配置在这里:https://gist.github.com/mc-suchecki/671ecb4d5ae4bae17f81
过滤器的顺序正确 - 元数据生成器过滤器在 SAML 过滤器之前。我不确定这是否相关 - 我想不是 - 但我的应用程序没有使用 Spring Boot - 示例应用程序(配置源)是。
提前感谢您的帮助。
【问题讨论】:
-
您是否尝试过在浏览器中使用 url : localhost:8443/<Application Context Root>/saml/metadata 来下载元数据?您尝试的网址根本没有应用程序名称。
-
我认为URL是正确的-如果不是,将有404状态码而不是500状态码,没有例外。
-
我在使用 spring-saml-extension 进行 SSO 时也遇到了这个错误。你能告诉我 saml.entity-id 属性的值吗
-
准确地说是 SAMLContextProviderImpl 类中的方法的代码 sn-p,您会在其中遇到错误。您的实体 ID 似乎为空。 void populateLocalEntity(SAMLMessageContext samlContext) 抛出 MetadataProviderException { String localEntityId = samlContext.getLocalEntityId(); QName localEntityRole = samlContext.getLocalEntityRole(); if (localEntityId == null) { throw new MetadataProviderException("未配置托管服务提供商,未选择别名"); }
-
是的,完全正确 - 我的 SAMLContext 中的本地实体 ID 为空。但问题是 - 为什么?
标签: java spring spring-security spring-saml