当前位置: 首页 > 知识库问答 >
问题:

Spring Security SAML插件-未配置托管服务提供程序例外

高勇
2023-03-14

我正在尝试使用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
// 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;
}

事先谢谢你的帮助。

共有1个答案

微生自怡
2023-03-14

这周我发现了这个问题。过滤器有问题。其中一个方法是创建“SAML过滤器”,如下所示:

public FilterChainProxy samlFilter() throws Exception {
    List<SecurityFilterChain> chains = new ArrayList<SecurityFilterChain>();
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/login/**"), samlEntryPoint()));
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/logout/**"), samlLogoutFilter()));
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/metadata/**"),
        metadataDisplayFilter()));
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSO/**"),
        samlWebSSOProcessingFilter()));
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSOHoK/**"),
        samlWebSSOHoKProcessingFilter()));
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SingleLogout/**"),
        samlLogoutProcessingFilter()));
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/discovery/**"), samlIDPDiscovery()));
    return new FilterChainProxy(chains);
}

之后,另一种方法是为Spring设置整个过滤器链,如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic().authenticationEntryPoint(samlEntryPoint());
    http.csrf().disable();
    http.addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class)
        .addFilterAfter(samlFilter(), BasicAuthenticationFilter.class);
    http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/error").permitAll()
        .antMatchers("/saml/**").permitAll().anyRequest().authenticated();
    http.logout().logoutSuccessUrl("/");
}

那是完全正确的。但是,当我使用Jetty server启动应用程序时,我试图只将'SAML筛选器‘连接到应用程序上下文。因此,在“元数据DisplayFilter”之前需要的“元数据GeneratorFilter”根本没有添加到筛选器链中。当我将'saml filter'更改为'spring securityfilter'时,一切都开始工作了。因为我对Jetty的使用不规范,所以这并不容易找到。

谢谢你的帮助!

 类似资料:
  • 我的问题是,这个“提供商app”是一个什么样的app?是否有任何Android API,该应用程序应该实现,以作为配置提供商?此配套应用程序如何将配置更改挂钩到中,以便托管应用程序能够检索这些更改? 我在这里问这个问题,因为不幸的是,我在Android文档中没有找到任何引用。

  • 我正在开发一个应用程序,将工作在两个不同的Android环境(消费者和企业市场)。假设它是一个短信应用程序,需要管理一打配置参数。 第一个环境是一个标准的Android设备,它没有启用Android Enterprise(AfW)功能。因此没有EMM(MDM)来提供Android代理/客户端应用程序作为实现托管配置提供程序的设备/配置文件所有者。 第二个环境是公司内部。EMM(MDM)用于管理所有

  • 问题内容: 在以下代码示例中: 我收到类似“未知提供者$ cookieStore”的angularjs错误。 “ myApp”具有Dependenciy和“ ngCookies”,并且对angular-cookies.min.js进行了评分,那么该代码有什么问题? 那是我在.config中执行此操作的事实吗? 问题答案: 因为只能在配置时传递提供程序,所以我最终没有通过请求转换器而是通过将服务创建

  • 2019-10-02T04:00:46.7615707Z ##[错误]错误: 无法获取资源类型“Microsoft.Web/网站”和资源名称“晨顿前端”的资源 ID。错误:无法提取托管服务主体的访问令牌。请为虚拟机“https://aka.ms/azure-msi-docs”配置托管服务标识 (MSI)。状态代码:400,状态消息:请求错误。 任何人都可以向我解释一下问题是什么? 我对 Azure

  • 使用 PHP-FPM 有多种方式来配置一个 web 服务器以提供 PHP 服务。传统(并且糟糕的)的方式是使用 Apache 的 mod_php。Mod_php将PHP 绑定到 Apache 自身,但是 Apache 对于该模块功能的管理工作非常糟糕。一旦遇到较大的流量, 就会遭受严重的内存问题。 后来两个新的可选项很快流行起来:mod_fastcgi 和 mod_fcgid。 两者均保持一定数量

  • 我已在单独的Weblogic域中成功配置了SAML 2.0身份提供程序 我们在另一个域的Weblogic中部署了一个ADF应用程序,该应用程序具有非SAML基于表单的身份验证(ReadOnlySQLAuthenticator用于验证凭据) 我想将第二个域配置为服务提供者(以使现有应用程序能够使用身份提供者登录)。 我做了以下工作: 配置SAML 2.0 Identity Asserter 在服务器