我使用Keyclok(KC)作为OIDC的身份代理。
1) 浏览客户端应用程序并按登录按钮
2) 后台登录按钮将调用KC认证endpoint,该endpoint将显示IDP登录页面
3) User1为登录页面添加书签并输入凭据并开始使用客户端网站
4)用户1在未退出时关闭浏览器
5)用户2立即出现并点击显示IDP登录页面的书签页面
6)用户2输入凭据,并得到以下错误:
[错误信息][1] [1]: https://i.stack.imgur.com/vn83h.png
7)一旦用户按下“返回应用程序”,就会显示用户1屏幕(这将用户1的信息暴露给用户2)
当用户2尝试直接使用IDP登录页面登录而没有任何问题时,如果用户1的会话处于活动状态,我如何使其过期。
您必须实现一个自定义验证器,并将其添加到Keyclock中的身份验证流中。实现Keyclok的Authenticator接口。
首先,您需要获取当前用户的会话列表,如下所示:
List<UserSessionModel> userSessions = session.sessions().getUserSessions(context.getRealm(), context.getUser());
会话
是一个键盘会话。上下文
可以在您接下来要覆盖的方法身份验证中访问。在这里,我们可以开始实现您正在寻找的行为:
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));
}
不要忘记在Keyclock发行版的部署下部署包含此行为的jar文件。此外,您必须在/META-INF/services下引用身份验证器。