Keycloak:获取当前 SSO 会话的 UserSessionModel

Posted

技术标签:

【中文标题】Keycloak:获取当前 SSO 会话的 UserSessionModel【英文标题】:Keycloak: Get UserSessionModel of the current SSO session 【发布时间】:2021-01-19 11:14:54 【问题描述】:

Keycloak 11.0.2

    有没有办法让UserSessionModel 分配给自定义身份验证器中的当前 SSO 会话?

我可以使用List<UserSessionModel>:

List<UserSessionModel> userSessions = context.getSession().sessions().getUserSessions(context.getRealm(), context.getUser());

但我不知道我可以使用AutheticationFlowContext 使用哪个过滤属性来过滤列表并获取当前 SSO 会话的 UserSessionModel。

现在我通过从身份验证请求 cookie KEYCLOAK_SESSION(它的最后一段)获取的 UserSessionModel.id 进行过滤。也许有一种直接的方法可以以某种方式使用AuthenticationFlowContext 来获取UserSessionModel.id

    我必须使用UserSessionModel.getNote() 来检索之前在同一 SSO 的另一个身份验证流程中设置的 UserSessionNotes。

直接方法不适用于我在另一个身份验证流程中设置的UserSessionNotes(但在同一个 SSO 中):

@Override
public void authenticate(AuthenticationFlowContext context) 
    Map<String,String> sessionNotes = context.getAuthenticationSession().getUserSessionNotes();
    // sessionNotes does not reflect notes set in another Authentication flows of the same SSO
    ...

所以,如果有人知道另一种方式来采取UserSessionNotes w/o UserSessionModel 这也是解决方案。

【问题讨论】:

【参考方案1】:

我在 Keycloak 论坛https://keycloak.discourse.group/t/getting-usersessionnotes-returns-null-while-data-persist/5172收到了答复

在 Authenticator 中获取当前 SSO 的UserSessionModel

@Override
public void authenticate(AuthenticationFlowContext context) 
    UserSessionModel userSessionModel;
    AuthenticationManager.AuthResult authResult = AuthenticationManager.authenticateIdentityCookie(context.getSession(),
            context.getRealm(), true);
    if (authResult != null) 
        // That is it:
        userSessionModel = authResult.getSession();
    

【讨论】:

以上是关于Keycloak:获取当前 SSO 会话的 UserSessionModel的主要内容,如果未能解决你的问题,请参考以下文章

如何通过ID获取其他用户信息(用户名,名字)? [Keycloak]

从 Keycloak 访问令牌中获取客户端会话 ID

Keycloak 多域登录

SSO 与 SAML、Keycloak 和 Nextcloud

如何在 Keycloak 中指定刷新令牌的生命周期

Keycloak 与 IDP 和 SSO 的集成