我正在使用 SAML 为运行 tomcat 的 Web 服务器实现 SSO 身份验证流程。使用 POST 或重定向绑定(bind)时一切正常,但从我读过的内容来看,我需要在 REST API 前支持 SAML 身份验证,我还需要配置和使用 ECP 配置文件。

如果我错了,首先纠正我,但 ECP 流程应该是这样的:

  • 客户端访问SP REST API
  • 客户端知道他需要进行身份验证,因此他设置了所需的 ECP header ( Accept: application/vnd.paos+xmlPAOS: urn:liberty:paos:2003-08;urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp )
  • SP 发现客户端未通过身份验证并返回包含 PAOS 请求的 SOAP 信封。
  • 客户端负责将其发送到其 ECP 消费者服务上的适当 IdP。
  • IdP 挑战客户端进行身份验证
  • IdP 以另一个 SOAP Envelop 的形式返回响应,在其主体中包含 saml 响应
  • 客户端必须将此响应发送到 SP 的 ECP/SOAP 断言消费者服务

  • 问题是所有这些工作直到第 6 步。在这一步我遇到了问题,即响应信封的正文包含一个 Destination 属性,该属性指向 SP 的 POST 断言消费者服务。此目标属性由 keycloak 设置,并且与我要将响应发送到的实际 ECP 服务不匹配。我们使用的 SAML 库是 opensaml,它根据此 Destination 属性检查请求 URI,如果它们不匹配,则会抛出异常 org.opensaml.xml.security.SecurityException: SAML message intended destination endpoint did not match recipient endpoint

    我理解为什么会抛出此异常,但无法理解如何使用 SP 的 ECP/SOAP 服务配置 Keycloak。在 Keycloak 的管理控制台中,我只能配置 SSO POST/Redirect 和 SLO POST/Redirect 的 URL,但不能配置 ECP。

    我目前正在配置另一个 IdP,但我真的很想确保 Keycloak 也可以成为我们解决方案支持的服务器。

    最佳答案

    你不能只阅读 paos:Request responseConsumerURL 并将 idp 响应发布到该 url 吗?

    至少,这就是我设法做到的。

    10-08 14:04