AEM 6.4.x + аутентификация SAML (Okta): Как мне прочитать (через Java) ответ SAML от моего поставщика единого входа? - PullRequest
0 голосов
/ 21 октября 2019

TLDR: Как использовать Java (или другую технологию, связанную с AEM), как получить имя пользователя, использованное для входа и последующего просмотра защищенной страницы?


Мы защитили некоторыестраницы через логин, который использует наш поставщик единого входа (Oka). Я хотел бы прочитать ответ SAML (или хотя бы получить имя пользователя, использованное для входа в систему).

Мы хотим настроить некоторые элементы, отображаемые на защищенной странице.

пример: получение и отображение имени пользователя, фамилии, отдела и другой информации, которые зарегистрированы в системе, которые хранятся в базе данных HR

Как это можно сделать?

Я смотрел накуки (и вкладка хранилища в Firefox в целом) и не может найти там ничего. Единственное место, где я могу видеть ответ SAML, - это использование браузера (например, SAML-tracer).

Я искал в сети, и результаты, которые я нашел, - это только настройка AEM для подключения к поставщику единого входа ( эта часть уже настроена и уже работает ).

Спасибо

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Вы не должны читать это из ответа SAML. Это следует читать из профиля пользователя. Обработчик проверки подлинности SAML позволяет сохранять атрибуты, предоставленные в ответе SAML, для пользователя AEM.

Когда обработчик проверки подлинности SAML регистрирует пользователя в AEM, пользователь-участник связывается со всеми последующими запросами, пока он остается в системе. Вы можете получить информацию о пользователе на основе принципала / авторизуемого в запросе

UserPropertiesManager upm = resourceResolver.adaptTo(UserPropertiesManager.class);
Authorizable authorizable = resourceResolver.adaptTo(Authorizable.class);
UserProperties userProperties = upm.getUserProperties(authorizable, "profile");

https://helpx.adobe.com/experience-manager/6-3/sites/developing/using/reference-materials/javadoc/com/adobe/granite/security/user/UserProperties.html

В то время как обработчик проверки подлинности SAML может сохранять атрибуты из ответа SAML для пользователя AEM;для того, чтобы он работал так, как задумано, на производстве, он может зависеть от ряда факторов, таких как количество издателей [для синхронизации данных], объем пользователей, соответствие сеансов и т. д.

По моему опыту, несмотря наплатформы, имеющей решения в форме синхронизации пользователей сообщества, инкапсулированной поддержки токенов для работы со схожестью сеансов и т. д., она не работает так, как объявлено, и вы можете переосмыслить использование SAML на издателе и представить способ прочитать этоинформация из истинного источника только с базовым профилем, попадающим в AEM. Если бы это было только для среды разработки, это все равно должно работать

1 голос
/ 21 октября 2019

Отказ от ответственности : Это не легко, и я не проверял это. Я только что декомпилировал обработчик аутентификации SAML и проверил, что там происходит.

Вы должны знать, что вы делаете, и вы должны постараться сделать его максимально надежным. В общем, работа с API-интерфейсами, связанными с аутентификацией в AEM, довольно громоздка.


Я не думаю, что вы сможете получить такую ​​информацию, как отдел и т. Д., Со "стандартного" токена SAML. Но давайте предположим, что это часть полезной нагрузки токенов.

Вам придется где-то хранить эту информацию. Вероятно, профиль пользователя (например, /home/users/a/<userid>/profile).

Я бы подумал, что это возможно с org.apache.sling.auth.core.spi.AuthenticationFeedbackHandler. Этот обработчик будет иметь доступ к запросу, ответу и информации аутентификации пользователя. Таким образом, вы должны реализовать такой обработчик, который затем будет вызываться после аутентификации пользователя.

Информация аутентификации - это в основном просто карта, которая содержит ключи с соответствующей информацией. Один такой ключ должен быть user.jcr.credentials. Для SAML это должен быть экземпляр com.adobe.granite.auth.saml.extidp.SamlCredentials.

Эти учетные данные содержат «атрибуты», которые вы можете прочитать через getAttribute(). Атрибут, который содержит «необработанный ответ SAML», называется samlResponse. Так что это должно дать вам то, что вы ищете:

private String getSamlResponse(final AuthenticationInfo authenticationInfo) {
    if (authenticationInfo == null) {
        return "";
    }

    Object credentialsObject = authenticationInfo.get("user.jcr.credentials");
    if (credentialsObject == null) {
        return "";
    }

    try {
        SamlCredentials credentials = (SamlCredentials) credentialsObject;
        String encryptedSamlResponse = credentials.getAttribute("samlResponse");
        if (encryptedSamlResponse == null || encryptedSamlResponse.trim().length() == 0) {
            return "";
        }

        return decryptSamlResponse(encryptedSamlResponse);
    } catch (ClassCastException e) {
        // Unable to cast "credentialsObject" to "SamlCredentials"
        return "";
    }
}

Примечание:

  1. В приведенном выше коде используется SamlCredentials. Этот класс публично не экспортируется пакетом com.adobe.granite.auth.saml. Вы должны декомпилировать пакет, скопировать и вставить этот класс в свой собственный пакет.
  2. Вы должны реализовать метод decryptSamlResponse, используя CryptoSupport .

Если токен SAML не содержит информацию, которую вы ищете, вы можете попытаться использовать адрес электронной почты пользователя для запроса какой-либо внешней базы данных, содержащей информацию, и затем сохранить ее в профиле пользователя.

Что бы вы ни делали, если вы делаете это на издателе, и у вас есть несколько издателей (как вы обычно должны это иметь), вам также придется подумать о синхронизации профиля пользователя между этими издателями или использовать липкое соединение. Насколько я могу судить, синхронизация является своего рода ошибкой и имеет несколько проблем, и вы можете столкнуться с ситуациями, когда первый запрос отправляется издателю 1, следующий запрос (вскоре после этого) отправляется издателю 2, у которого еще нет синхронизированного профиля. ,Вероятно, лучше использовать липкие соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...