春季 SAML wso2

Posted

技术标签:

【中文标题】春季 SAML wso2【英文标题】:Spring SAML wso2 【发布时间】:2014-11-13 08:03:12 【问题描述】:

我正在使用 Spring saml 示例和 wso2 身份服务器中 saml 的基本配置来实现 saml 身份验证

到目前为止,当 wso2 服务器响应我的应用程序时,我在登录后收到此错误。

我不知道要注意什么。

org.springframework.security.authentication.AuthenticationServiceException:确定元数据合同时出错 在 org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:91) 在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:211) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:166) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.saml.metadata.MetadataGeneratorFilter.doFilter(MetadataGeneratorFilter.java:87) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1636) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:564) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1111) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:498) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1045) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199) 在 org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:98) 在 org.eclipse.jetty.server.Server.handle(Server.java:461) 在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:284) 在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:244) 在 org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:534) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536) 在 java.lang.Thread.run(Thread.java:744) 原因:org.opensaml.saml2.metadata.provider.MetadataProviderException:找不到发行者的元数据某事 在 org.springframework.security.saml.processor.SAMLProcessorImpl.retrieveMessage(SAMLProcessorImpl.java:108) 在 org.springframework.security.saml.processor.SAMLProcessorImpl.retrieveMessage(SAMLProcessorImpl.java:172) 在 org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:77) ... 36 更多

【问题讨论】:

我面临与上述完全相同的问题。这是 2 岁,但我不想问同样的问题。我正在使用 WSO2 IS 5.2。我研究了源代码,发现错误发生在 SAMLProcessorImpl 类中。具体在这里: if (samlContext.getPeerEntityMetadata() == null) throw new MetadataProviderException("Metadata for issuer " + samlContext.getInboundMessageIssuer() + " was not found");你找到答案了吗? 【参考方案1】:

我能够通过确保“身份提供者实体 ID”与“IdP 元数据实体 ID”匹配来解决此问题。 “身份提供者实体 ID”设置位于 WSO2 IS(版本 5.2.0)管理控制台中,位于:身份提供者/居民身份提供者/SAML2 Web SSO 配置下。

“IdP 元数据 entityID”是 EntityDescriptor 标签的一个属性(根据spec)。我手动创建了 WSO2 IdP 元数据。这是我的 IdP 元数据:

<EntityDescriptor entityID="localhost_wso2" validUntil="2023-09-23T06:57:15.396Z" xmlns="urn:oasis:names:tc:SAML:2.0:metadata" >
<IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<KeyDescriptor use="signing">
 <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
   <ds:X509Data>
    <ds:X509Certificate>...</ds:X509Certificate>
   </ds:X509Data>
 </ds:KeyInfo>
</KeyDescriptor>
<SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://localhost:9443/samlsso" ResponseLocation="https://localhost:9443/samlsso"/>
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://localhost:9443/samlsso"/>
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://localhost:9443/samlsso"/>
</IDPSSODescriptor>
</EntityDescriptor>

我在我的 Spring-Saml 配置中引用了上述 IdP 元数据,如下所示:

<bean id="metadata" class="org.springframework.security.saml.metadata.CachingMetadataManager">
<constructor-arg>
  <list>
    <!-- Example of classpath metadata with Extended Metadata -->
    <bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
      <constructor-arg>
        <bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
          <constructor-arg>
            <bean class="java.util.Timer"/>
          </constructor-arg>
          <constructor-arg>
            <bean class="org.opensaml.util.resource.ClasspathResource">
              <constructor-arg value="/metadata/wso2idp_metadata.xml"/>
            </bean>
          </constructor-arg>
          <property name="parserPool" ref="parserPool"/>
        </bean>
      </constructor-arg>
      <constructor-arg>
        <bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
        </bean>
      </constructor-arg>
    </bean>
  </list>
</constructor-arg>
</bean>

【讨论】:

【参考方案2】:

我认为 Spring SAML 示例正在寻找 IDP 元数据。它可以假设 WSO2 身份服务器支持 SAML 元数据配置文件。但据我所知,身份服务器仍然不支持this 配置文件。但是,可能有一个地方可以手动配置示例中的 IDP 元数据。因此,请检查它。因为通常不需要所有 IDP 都支持这个配置文件,所以必须有一些选项来忽略它并手动执行它。

另外,您可以从 [this] blog 找到手动创建的 Identity Server 的 IDP 元数据

【讨论】:

是的,我正在使用在博客中找到的元数据。但我没有对上面提到的发行者进行硬编码,我试图找出忽略它或设置一个有效的发行者。谢谢。

以上是关于春季 SAML wso2的主要内容,如果未能解决你的问题,请参考以下文章

SAML OAuth 集成 - 切换 SAML

SAML 元数据与 SAML 请求和响应的区别

Spring SAML - 支持自定义 SAML 断言

基于 SAML 断言授权的 SAML2 身份验证

护照-saml 和 SAML 加密

Spring SAML - 用户从应用程序注销时是不是必须调用 SAML 本地注销?