在Keycloak中,当用户2尝试使用IDP登录页面登录时,如何自动注销(终止会话)用户1?

hbo*_*go1 5 openid-connect keycloak

我使用 Keycloak (KC) 作为 OIDC 的身份代理。

1) 浏览客户端应用程序并按登录按钮

2) 后台登录按钮将调用 KC 身份验证端点,该端点将显示 IDP 登录页面

3) User1 将登录页面添加为书签并输入凭据并开始使用客户端网站

4) User1 关闭浏览器而不注销

5) User2 立即出现并点击显示 IDP 登录页面的书签页面

6) User2 输入凭据并收到以下错误:

[错误消息][1][1]:https://i.stack.imgur.com/vn83h.png

7)一旦用户按下“返回应用程序”,就会显示 user1 屏幕(这会将 user1 信息公开给 user2)

当 user2 尝试直接使用 IDP 登录页面登录而没有任何问题时,如果 user1 的会话处于活动状态,我如何才能使 user1 的会话过期?

小智 0

您必须实现自定义身份验证器并将其添加到 Keycloak 中的身份验证流程中。实现Keycloak的Authenticator接口。

首先,您需要获取当前用户的会话列表,如下所示:

List<UserSessionModel> userSessions = session.sessions().getUserSessions(context.getRealm(), context.getUser());
Run Code Online (Sandbox Code Playgroud)

session是一个KeycloakSession。可以context在您接下来要重写的方法内部访问。在这里我们可以开始实现您正在寻找的行为:

 private void logoutOldestSession(List<UserSessionModel> userSessions) {
        logger.info("Logging out oldest session");
        Optional<UserSessionModel> oldest = userSessions.stream().sorted(Comparator.comparingInt(UserSessionModel::getStarted)).findFirst();
        oldest.ifPresent(userSession -> AuthenticationManager.backchannelLogout(session, userSession, true));
    }
Run Code Online (Sandbox Code Playgroud)

不要忘记在 Keycloak 发行版的部署下部署包含此行为的 jar 文件。另外,您必须在 /META-INF/services 下引用您的身份验证器。