Keycloak KeyClope-添加登录的附加步骤

Keycloak KeyClope-添加登录的附加步骤,keycloak,Keycloak,我的情况是,在登录期间,用户输入用户名/密码后,他们将被转移到另一个页面,在该页面上他们必须输入另一个字段(或从选择框中选择某个内容) 今天,我在cookie上使用了一个简单的会话id。当用户输入他们的凭据时,我创建一个会话,在他们在附加页面中输入该字段后,我更新会话 我在想,在KeyClope中实现类似目标的最佳方式是什么。我还希望在令牌中包含该附加字段 我想最明显的方法是保持我的登录前端现在的状态,并使用KeyClope提供的直接凭证授权API,但我宁愿避免这种情况 请告知 澄清:系统中的每

我的情况是,在登录期间,用户输入用户名/密码后,他们将被转移到另一个页面,在该页面上他们必须输入另一个字段(或从选择框中选择某个内容)

今天,我在cookie上使用了一个简单的会话id。当用户输入他们的凭据时,我创建一个会话,在他们在附加页面中输入该字段后,我更新会话

我在想,在KeyClope中实现类似目标的最佳方式是什么。我还希望在令牌中包含该附加字段

我想最明显的方法是保持我的登录前端现在的状态,并使用KeyClope提供的直接凭证授权API,但我宁愿避免这种情况

请告知


澄清:系统中的每个用户可以属于多个组织。该附加字段对应于用户登录的组织。所有与令牌交互的应用程序都必须知道该组织字段,根据您的要求,我建议如下:

  • 继续使用UserStorageProvider实现。请参阅以下内容。您的实现还应该为每个用户提供可用公司的列表。可以将此列表作为UserModel属性公开

  • 实现自定义所需操作(类似于在成功通过凭据挑战后运行的组件),该操作将从经过身份验证的用户的UserModel对象获取可用公司的列表。将此列表作为单独的登录表单提供给用户,所以在用户提交其选择后,它将保留在用户会话注释中。作为示例,请查看的实现和的javadoc。以下是存储所选公司的逻辑示例:

    @Override
    public void requiredActionChallenge(RequiredActionContext context) {
        List<String> availableCompanies = context.getUser().getAttribute("companies");
        ... // form rendering
    }
    
    @Override
    public void processAction(RequiredActionContext context) {
        String company = context.getHttpRequest().getFormParameters().getFirst("selected_company");
        context.getAuthenticationSession().setUserSessionNote("company", company);
    }
    
    @覆盖
    public void requiredActionChallenge(RequiredActionContext上下文){
    列出可用公司=context.getUser().getAttribute(“公司”);
    …//表单呈现
    }
    @凌驾
    public void processAction(RequiredActionContext上下文){
    字符串company=context.getHttpRequest().getFormParameters().getFirst(“所选公司”);
    context.getAuthenticationSession().setUserSessionNote(“公司”,公司);
    }
    
  • 将UserSessionNote oidc映射器添加到所需的客户端(或共享客户端范围),这样它将从步骤2中提取由所需操作实现保存的“公司”注释

  • 利润


  • 有多少应用程序(我所说的应用程序指的是keydape OIDC客户端)将使用来自您额外的后期验证步骤的数据?如果该数据只应由特定客户端使用,最好将该逻辑移动到专用应用程序,否则可以将其作为SPI扩展添加到KeyClope。请提供更多关于您需要的功能的详细信息require@solveMe谢谢你的回答。我已经更新了这个问题。基本上,这个附加字段可以被任何与令牌交互的客户机/应用程序使用,所以我认为它必须是keydepot中身份验证过程的一部分。我已经阅读了有关SPI扩展的内容,事实上,我正在尝试为
    UserStorageProvider
    创建一个扩展(因为系统的用户存储在外部数据库中)。您能否提供一些关于为我创建SPI的阅读/观看材料?我是否正确理解用户可以属于多个公司,并且在每次登录时可以切换到另一个公司?这是一个相当奇怪的场景。若我错了,用户经常和某个公司进行一对一的绑定,那个么USP的实现方向是正确的。您可以将公司绑定公开为UserModel属性,然后在OIDC用户属性映射器中使用此属性值添加公司以访问/刷新令牌。@solveMe用户通常具有一对一映射,但有些用户可以具有一对多映射(一个用户可以属于多个公司)。在这种情况下,我希望允许用户在输入用户名/密码后选择要登录的公司。谢谢!我将尝试它并更新它是如何工作的。谢谢你的帮助!