Keycloak: получить UserSessionModel текущего сеанса единого входа

#keycloak #authenticator

#keycloak #аутентификатор

Вопрос:

Keycloak 11.0.2

  1. Есть ли способ получить UserSessionModel назначение текущему сеансу единого входа в пользовательском аутентификаторе?

Я могу принять List<UserSessionModel> :

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

Но я не знаю, какое свойство фильтрации я могу использовать AutheticationFlowContext для фильтрации списка и получения UserSessionModel текущего сеанса единого входа.

Теперь я фильтрую по UserSessionModel.id извлеченному из cookie-файла запроса на аутентификацию KEYCLOAK_SESSION (последний его сегмент). Может быть, есть прямой способ UserSessionModel.id AuthenticationFlowContext как-то использовать?

  1. Я должен использовать UserSessionModel.getNote() для извлечения UserSessionNotes, установленных ранее в других потоках аутентификации того же единого входа.

Прямой метод не работает для меня, чтобы использовать UserSessionNotes set в других потоках аутентификации (но в том же 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

Для получения 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();
    }