使用Keycloak实现IDP发起的SSO

7
此问题涉及基于SAML的IDP启动SSO领域。作为POC,我有两个Keycloak实例,即keycloak1和keycloak2。我想要实现以下内容:
1. 认证将在keycloak1上完成 2. keycloak1然后指向keycloak2以访问keycloak2客户端应用程序。
要做到这一点,
a) 在realm1下的keycloak1创建一个SAML客户端。使用设置为某个没有空格的“IdP启动SSO名称”(例如keycloakclientsaml)。在Fine Grain SAML Endpoint Configuration部分中,对于Assertion Consumer Service POST Binding URL,使用http:///auth/realms/realm2/broker/saml/endpoint/clients/keycloakclientsaml。
https://www.keycloak.org/docs/latest/server_admin/index.html#idp-initiated-loginb) 点击上面创建的SAML客户端 --> 安装 --> 导出SAML元数据IDPSSODescriptor并保存为saml-metadata.xml(例如)。

c) 在keycloak1中添加一个用户,比如user1/user@123

d) 在keycloak2中创建一个IDP(身份提供者选项卡)。导入上述导出的saml-metadata.xml文件并保存。

e) 在浏览器中输入 http://<keycloak1>/auth/realms/realm1/protocol/saml/clients/keycloakclientsaml ,提示输入用户名/密码,输入用户1的凭据。

f) 浏览器中的URL现在更改为

http://<keycloak2:port>/auth/realms/realm2/broker/saml/endpoint/clients/keycloakclientsaml

在keycloak2实例中,我收到以下错误:

09:20:46,775 INFO [org.keycloak.saml.validators.ConditionsValidator] (default task-6) Assertion ID_789213dd-24f9-425f-ae20-bcadef173bc6 is not addressed to this SP. 09:20:46,775 ERROR [org.keycloak.broker.saml.SAMLEndpoint] (default task-6) Assertion expired. 09:20:46,775 WARN [org.keycloak.events] (default task-6) type=IDENTITY_PROVIDER_RESPONSE_ERROR, realmId=realm2, clientId=null, userId=null, ipAddress=keycloak2, error=invalid_saml_response

有人可以在这里提供帮助。

  1. 以上步骤是否正确且完整?
  2. 我错过了什么?

如果需要其他信息,请告诉我。我很乐意提供。

1个回答

5

终于让它工作了。

因此,这里是上面问题的答案:

上面粘贴的错误与过期的断言有关。在我的情况下,是因为 keycloak1 的 SAML 客户端中给定的 clientid 未被 keycloak2 的 URL 识别。它应该指向 keycloak2 的领域(例如,http://<keycloak2:port>/realms/realm2),然后在 SAML 响应的条件部分将在 keycloak2 经纪人 idp 进行验证。(代码:SAMLEndpoint.java --> handleLoginResponse方法)

将此线程放在这里,并为清晰起见,在下面详细说明步骤:

a)在 realm1 下的 keycloak1 创建一个 SAML 客户端。对于 IdP 启动的 SSO 名称设置为某个不带空格的名称,比如 sso

b)在上述客户端的 Fine Grain SAML Endpoint Configuration 部分,对于 Assertion Consumer Service(ASC)POST Binding URL -> http://<keycloak2:port>/auth/realms/realm2/broker/saml/endpoint/clients/keycloak2samlclient

( https://www.keycloak.org/docs/latest/server_admin/index.html#idp-initiated-login)

c)在 keycloak1 中添加一个名为 user1/user@123 的用户。

d)在 keycloak2 上创建一个 IDP(身份提供者标签,名称为 saml(参考 ASC URL)。导入上面导出的 saml-metadata.xml 并保存。

e)在 keycloak2 中创建一个 SAML 客户端,并在 IP 启动的 SSO URL 中将名称设置为 keycloak2clientsaml

f)在浏览器中输入 http://<keycloak1>/auth/realms/realm1/protocol/saml/clients/sso,提示输入用户名/密码,输入 user1 的凭据。


感谢您的教程。第c)点应该是在keycloak1中添加一个用户,比如user1/user@123,改为在keycloak2中添加一个用户吗?您需要映射系统的SAML响应吗?感谢您的回答。 Lukas - Lukáš Slamka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接