如何将 Spring SAML 示例应用程序连接到 Weblogic IDP?

How can I connect the Spring SAML example application to a Weblogic IDP?

  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)

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

No artifact resolution service endpoint defined for the entity null

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

我试图让示例应用程序针对 Weblogic IDP 和 Shibboleth IDP 进行身份验证,但我没能成功。要么配置不完整,要么我缺少一些基本的东西。

您使用的是哪个 Weblogic 版本?至少在旧版本中,Oracle 顾问告诉我 Weblogic 的 SAML IDP 支持不是 "production quality" 并且实现确实存在问题(例如使用旧库,不支持 SAML 加密,处理错误),但它可能已经改变自从.

错误 "No artifact resolution service endpoint" 表明您的 IDP 的元数据在其元数据中没有 ArtifactResolutionEndpoint。在你的地方,我会尝试使用 HTTP-POST 绑定而不是 Artifact.

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)
  • Select SAML2CredentialMappertype
  • 保存新映射

1.1.3。点击新建映射

2。配置 SAML 属性

2.1。导航至服务器页面

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

2.2。导航到联合身份验证服务 > SAML 2.0 常规

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

    例如http://localhost:7101/saml2

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

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

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

  • 保存设置

2.3。切换到 SAML 2.0 身份提供商选项卡

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

3。交换元数据信息

3.1。导出 IDP 元数据

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

3.1.1。导航到联合身份验证服务 > SAML 2.0 常规

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

3.2。在服务提供商应用程序中使用元数据文件

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

3.3。获取服务提供商元数据文件

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

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

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

链接