【问题标题】:How can I connect the Spring SAML example application to a Weblogic IDP?如何将 Spring SAML 示例应用程序连接到 Weblogic IDP?
【发布时间】:2015-06-18 11:05:34
【问题描述】:
  1. 我在这里下载了 Spring SAML 示例应用程序: http://docs.spring.io/spring-security-saml/docs/current/reference/htmlsingle/#quick-start-steps
  2. 我运行了应用程序并成功通过了 SSOCircle IDP 的身份验证。
  3. 然后我尝试切换到 Weblogic IDP,但是当我尝试身份验证时,它失败并出现异常。

异常堆栈跟踪:

Jun 17, 2015 10:33:31 AM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet [default] in context with path [] threw exception [org.opensaml.ws.message.encoder.MessageEncodingException: Unable to builder artifact for message to relying party] with root cause
    org.opensaml.ws.message.encoder.MessageEncodingException: Unable to builder artifact for message to relying party
            at org.opensaml.saml2.binding.encoding.HTTPArtifactEncoder.buildArtifact(HTTPArtifactEncoder.java:232)
            at org.opensaml.saml2.binding.encoding.HTTPArtifactEncoder.getEncode(HTTPArtifactEncoder.java:195)
            at org.opensaml.saml2.binding.encoding.HTTPArtifactEncoder.doEncode(HTTPArtifactEncoder.java:137)
            at org.opensaml.ws.message.encoder.BaseMessageEncoder.encode(BaseMessageEncoder.java:52)
            at org.springframework.security.saml.processor.SAMLProcessorImpl.sendMessage(SAMLProcessorImpl.java:227)
            at org.springframework.security.saml.processor.SAMLProcessorImpl.sendMessage(SAMLProcessorImpl.java:195)
            at org.springframework.security.saml.websso.AbstractProfileBase.sendMessage(AbstractProfileBase.java:144)
            at org.springframework.security.saml.websso.WebSSOProfileImpl.sendAuthenticationRequest(WebSSOProfileImpl.java:105)
            at org.springframework.security.saml.SAMLEntryPoint.initializeSSO(SAMLEntryPoint.java:226)
            at org.springframework.security.saml.SAMLEntryPoint.commence(SAMLEntryPoint.java:153)
            at org.springframework.security.saml.SAMLEntryPoint.doFilter(SAMLEntryPoint.java:107)
            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.saml.metadata.MetadataGeneratorFilter.doFilter(MetadataGeneratorFilter.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:241)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
            at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
            at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
            at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
            at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
            at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
            at java.lang.Thread.run(Thread.java:745)

在日志中有另一条消息说:

没有为实体 null 定义工件解析服务端点

  1. 如何才能使工件解析成功? 我调试了应用程序,发现方法 org.opensaml.saml2.binding.artifact.SAML2ArtifactType0004Builder#getAcsEndpoint() 返回 null,导致上述异常.我不太确定这意味着什么,或者如何才能让它发挥作用。
  2. 我导出 IDP 元数据并将其包含在元数据提供程序 bean 中,然后导出 SP 元数据并将其作为联合伙伴元数据上传到 Weblogic。 我错过了什么吗?

我尝试使示例应用程序针对 Weblogic IDP 和 Shibboleth IDP 进行身份验证,但我没有设法使其工作。要么配置不完整,要么我缺少一些基本的东西。

【问题讨论】:

    标签: weblogic saml-2.0 spring-saml


    【解决方案1】:

    1.添加凭据映射

    要启用 SAML 功能,我们首先需要添加凭据映射。 打开 Weblogic 管理控制台

    http://server:port/console
    e.g.
    http://127.0.0.1:7101/console
    

    1.1.添加映射条目

    1.1.1。导航到凭据映射页面:

    Security Realms > myrealm > Providers > Credential Mapping
    

    1.1.2。点击新按钮

    • 输入映射名称(例如 SamlCredentialMapper)
    • 选择 SAML2CredentialMappertype
    • 保存新映射

    1.1.3。点击新映射

    2。配置 SAML 属性

    2.1.导航到服务器页面

    • 打开管理服务器的服务器条目。
    • 注意“常规”选项卡上“监听地址”和“监听端口”的值。

    2.2.导航到联合服务 > SAML 2.0 常规

    • 输入已发布站点 URL 的值(主机和端口应与您在上一步中记下的值相同):

      例如http://localhost:7101/saml2

    • 输入一个实体 ID(请注意,此 ID 必须与您之前输入的颁发者 URI 相同)

      例如http://www.server.com/issuer

    • 必须与凭据映射中的颁发者 URI 相同。

    • 保存设置

    2.3.切换到 SAML 2.0 身份提供程序选项卡

    • 选中已启用的复选框。
    • 选择 POST 作为首选绑定。
    • 保存设置。

    3.交换元数据信息

    3.1.导出 IDP 元数据

    服务提供者(SSO 客户端)应用程序使用身份提供者元数据文件来确定登录 URL 和其他有用信息。

    3.1.1.导航到联合服务 > SAML 2.0 常规

    • 点击发布元数据按钮。
    • 为元数据文件选择一个文件名
      • 通过在路径文本字段中输入路径/文件名
      • 或通过选择目录结构中的现有文件(您必须选中“覆盖”复选框才能覆盖该文件)
    • 单击“确定”导出元数据文件。

    3.2.在 Service Provider 应用程序中使用元数据文件

    Service Provider 应用程序需要知道在哪里可以找到 IDP。此信息包含在 IDP 元数据文件中。

    3.3.获取服务提供者元数据文件

    IDP 还需要了解服务提供商(SSO 客户端)。 您需要获取SP元数据文件。

    3.4.配置服务提供商合作伙伴

    • 导航到您之前创建的凭据映射。
    • 转到“管理”选项卡。
    • 创建新的 Web 单点登录服务提供商合作伙伴。
    • 选择一个名称(或保留默认)
    • 通过导航到目录并选择目录结构中的现有文件来选择 SP 元数据文件
    • 单击“确定”保存新伙伴。
    • 点击新的服务提供商合作伙伴。
    • 选中已启用的复选框。
    • 点击保存。

    链接

    【讨论】:

      【解决方案2】:

      您使用的是哪个 Weblogic 版本?至少在旧版本中,Oracle 顾问告诉我,Weblogic 的 SAML IDP 支持不是“生产质量”,并且实施确实存在问题(例如使用旧库、不支持 SAML 加密、处理错误),但它可能已经改变了.

      “无工件解析服务端点”错误表明您的 IDP 的元数据在其元数据中没有 ArtifactResolutionEndpoint。在你的位置,我会尝试使用 HTTP-POST 绑定而不是 Artifact。

      【讨论】:

      • 我们将 Weblogic 10.3.6 与 Oracle Webcenter 11.1.1.7 结合使用。
      • IDP 元数据列出了一个工件解析服务 URL,如下所示:localhost:7101/saml2/idp/ars/soap" index="0" isDefault="true"/> 只需在浏览器中打开 URL 就会引发 NullPointerException。从我目前了解到的情况来看,这似乎是 Weblogic 和其他 Oracle 软件的一个特性,而不是一个错误 :-)
      • 我正在努力让这件事发挥作用,并且我正在学习 SSO 和 SAML 的所有理论,因此我可能无法精通所有细节。我以某种方式假设 HTTP-POST 将是默认设置,但我不确定其他绑定是如何工作的。
      • 我询问了支持 Oracle 的 NPE,但他们只是说我必须尝试使用​​实际的 SP 应用程序进行身份验证以验证它是否有效。我只是不确定错误应该归咎于哪一方(就像我说我不是 SSO/SAML 专家)。
      • 我会尝试切换到 HTTP-POST 看看是否有帮助。
      猜你喜欢
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多