Keycloak GSS Делегирование учетных данных, когда браузер не находится в домене AD - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть веб-приложение, которое использует Keycloak / OpenID Connect для аутентификации пользователя в Windows AD.

Пользователи не будут использовать браузер на рабочей станции в домене Windows AD.

Сервер веб-приложений (Tomcat с адаптером Keycloak) работает в домене Windows AD.

Веб-приложение настроено для подключения Keycloak / OpenID.Область Keycloak настроена на использование Windows AD Kerberos / LDAP.

Браузер пользователя пересылает данные для входа в Keycloak и после успешного входа переходит обратно в веб-приложение.

Требуется веб-приложениедля подключения к IBM i с использованием билета Kerberos / учетных данных GSS IBM i настроен на SSO / EIM с помощью Windows AD.Это работает.

Я настроил клиент Keycloak для пересылки учетных данных GSS.

Я пытаюсь получить учетные данные GSS из запроса сервлета с помощью клиента Keycloak

            // Obtain accessToken in your application.
        KeycloakPrincipal<KeycloakSecurityContext> kcp = (KeycloakPrincipal<KeycloakSecurityContext>)request.getUserPrincipal();
        AccessToken at = kcp.getKeycloakSecurityContext().getToken();
        String username = at.getPreferredUsername();
        wtr.append("Windows User: ").append(username).append(newLine);

        // Retrieve kerberos credential from accessToken and deserialize it

        Map<String, Object> otherClaims = at.getOtherClaims();
        Object otherClaim = otherClaims.get(KerberosConstants.GSS_DELEGATION_CREDENTIAL);
        String serializedGSSCred = (String) otherClaim;
        GSSCredential gssCredential = KerberosSerializationUtils.deserializeCredential(serializedGSSCred);

.Карта otherClaims пуста.Таким образом, десериализация создает исключение нулевого указателя с сообщением

org.keycloak.common.util.KerberosSerializationUtils$KerberosSerializationException: Null credential given as input. Did you enable kerberos credential delegation for your web browser and mapping of gss credential to access token?, Java version: 1.8.0_152, runtime version: 1.8.0_152-b16, vendor: Oracle Corporation, os: 6.2
at org.keycloak.common.util.KerberosSerializationUtils.deserializeCredential(KerberosSerializationUtils.java:70)

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Поскольку «пользователи не будут использовать браузер на рабочей станции в домене Windows AD», Keycloak никогда не получит учетные данные GSS из браузера и не сможет переслать их в ваше веб-приложение Java.

Я нашел в Документация Keycloak в разделе Kerberos , Keycloak не поддерживает Kerberos Constrained Delegation (пока) и поэтому не может выдавать себя за пользователя - т.е. генерировать TGT от имени конечного пользователя на основе его имени для входа.

С моей точки зрения, ваше веб-приложение на Java должно вызывать ограниченное делегирование Kerberos S4U2Self для олицетворения, а затем запрашивать TGS для ожидаемого имени участника-службы с S4U2Proxy для аутентификации в службе IBM i.

Вы можете сообщить о следующих примерахчтобы достичь этого:

0 голосов
/ 08 февраля 2019

Чтобы браузер мог согласовывать (SPNEGO), он должен находиться в домене AD (также необходимо настроить делегирование на уровне AD, используя поле msDS-AllowedToDelegateTo), чтобы KC выдал себя за пользователяна бэкэнд-сервис.Я ожидаю, что вы получите 401 (Несанкционированный), на который ваш браузер не может ответить, поскольку он не сможет получить билет Kerberos.Теоретически вы можете выполнить базовую аутентификацию на веб-сервере, получить билет Kerberos в своем веб-приложении и переслать его бэкэнду ...

...