single-sign-on - keycloak - 基于用户名(电子邮件地址)的领域解析

标签 single-sign-on multi-tenant keycloak

我正在处理一个 Multi-Tenancy 项目,其中用户名实际上是他们的电子邮件地址,电子邮件的域用作租户标识符。

现在在 keycloak 中,每个租户都有不同的领域,但我希望为所有租户和实际领域拥有一个登录页面,该页面将进行身份验证以通过用户名(电子邮件地址)以某种方式解析。

我该怎么做?

我在邮件列表(我现在找不到……)上找到了一个讨论相同问题的线程。这类似于 - 创建一个可以“代理”其他领域的主要领域,但我不太确定如何做到这一点。

最佳答案

我认为 Michał Łazowik 的答案是正确的,但是要使单点登录起作用,它需要稍微扩展一下。
请记住,因为 KEYCLOAK-4593如果我们有 > 100 个领域,我们可能还需要有多个 Keycloak 服务器。
我们需要:

  • 专门用于此目的的单独 HTTP 服务器,auth-redirector.example.com .
  • 从用户名(电子邮件地址)确定 Keycloak 服务器和领域的算法。

  • 以下是整个 OAuth2 授权代码流程:
    应用程序发现用户想要登录。在多个领域之前,领域的名称将是一个常量,因此应用程序将重定向到:https://keycloak.example.com/auth/realms/realname/protocol/openid-connect/auth?$get_params相反,它重定向到https://auth-redirector.example.com/?$get_paramsauth-redirector 确定它本身是否具有此 session 的有效访问 token ,可能必须首先从发布它的 Keycloak 服务器刷新访问 token (用户可能已注销并尝试以不同的用户身份登录)来自不同的领域)。
    如果它有一个有效的访问 token ,我们可以根据访问 token 中的用户名或电子邮件地址确定 Keycloak 服务器和领域,并重定向到:https://$keycloak_server/auth/$realm/realname/protocol/openid-connect/auth?$get_params从这里开始,OAuth2 授权代码流程照常进行。
    否则,如果它没有有效的访问 token ,则 auth-redirector 将存储原始应用程序的 $get_params作为 session 数据。它向用户呈现一个表单,要求输入用户名。当用户提交时,我们可以确定要使用的 Keycloak 服务器和领域,然后 auth-redirector 本身使用自己的 $get_params 登录到 Keycloak 服务器。 .一旦 auth-redirector 收到回调,它就会从 Keycloak 服务器检索访问+刷新 token 并将它们存储在 session 数据中。然后,最后,它重定向回与调用者原始 $get_params 相同的 key 斗篷服务器和领域。 (来自 session 数据)。 OAuth2 授权代码流程照常进行。
    这绝对是一个黑客!但我认为它可以工作。如果时间允许,我很想有一天尝试一下。
    其他 OAuth2 流程需要其他黑客/解决方案......

    关于single-sign-on - keycloak - 基于用户名(电子邮件地址)的领域解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44583833/

    相关文章:

    security - 基于 token 的身份验证的 SSO 安全性如何?

    c# - asp.net C# 上的 SSO 库

    c# - Multi-Tenancy - 为每个租户动态创建数据库

    architecture - 可以使用 Keycloak 作为用户数据库吗?

    spring-security - 将 Spring SAML 集成为 SP,将 SimpleSAMLphp 集成为 IdP(HoK 配置文件)

    apache - 为什么不同域中的浏览器根本不响应 mod_auth_kerb 发送的 "WWW Authenticate : Negotiate" header ?

    php - Multi-Tenancy - 预先或根据需要创建表?

    php - 如何在运行时连接到不同的数据库?

    spring-boot - 使用 Keycloak 授权服务与 Spring Boot(资源服务器)

    java - Keycloak 自定义用户存储不显示属性