我正在单个 Keycloak 领域内设置多个 SAML 客户端(Keycloak 是 IdP)。这个想法是在同一领域内为同一 SP 拥有多个 SAML 客户端。
SAML client 1
将由 Entity A
使用,SAML client 2
将由 Entity B
使用。
服务提供商是一个外部应用程序,其中
Issuer
中的 SAMLRequest
对于所有客户来说都是相同的(我们称之为 https://test.net/
)。
在 Keycloak 中创建第一个 SAML 客户端没有问题,一切正常。在同一个 Keycloak 领域中创建第二个 SAML 客户端时,我在设置
Client ID
时收到错误,因为 Client ID
通常需要与 SP Issuer
匹配,但由于 https://test.net/
已被该客户端的客户端 ID 占用Keycloak 中的第一个 SAML 客户端,我无法添加具有相同 Client ID
的第二个 SAML 客户端。
如果我将第二个 SAML 客户端的
Client ID
更改为 https://test.net/
以外的其他内容,则 SAML 流程会中断,因为 SP 在 Issuer
中传递的 SAMLRequest
与第一个 SAML 客户端的 Client ID
不匹配Keycloak 中的第二个 SAML 客户端。
其他 IdP(例如 Azure AD 和 Okta)为每个 SAML 客户端提供唯一的登录 SAML 端点,以便当 SP 调用 IdP SAML 端点时,IdP 已经知道应针对哪个 SAML 客户端对用户进行身份验证,并且不依赖于SP
Issuer
.
如何在同一领域中为每个 SAML 客户端拥有唯一的 SAML 端点,以便 Keycloak 不只依赖于 SP
Issuer
?
我已经找到了解决这个问题的方法。 Keycloak 不允许同一领域内的每个 SAML 客户端拥有唯一的 SAML 端点(对于“SP 发起的登录”),但它确实为同一领域内的每个 SAML 客户端提供唯一的 URL,用于“IdP 发起的登录” .
因此,解决方案是为每个 SAML 客户端输入唯一的 IdP 发起的登录 URL 作为外部应用程序中的 SAML 端点(在服务提供商 SSO 设置上)。这会将用户转发到 IdP 发起的登录流程(即使用户在 SP 端发起 SSO 登录),并且由于 URL 对于相应的 SAML 客户端是唯一的,因此 Keycloak 已经知道要针对哪个 SAML 客户端对用户进行身份验证使流程完全独立于 SP 发行者/客户 ID