Поделиться через


Включение входа для приложений Java WebSphere с помощью MSAL4J с Azure Active Directory B2C

В этой статье показано приложение Java Servlet, которое проверяет подлинность пользователей в Azure Active Directory B2C (Azure AD B2C) с помощью библиотеки проверки подлинности Майкрософт для Java (MSAL4J).

На следующей схеме показана топология приложения:

Схема, показывющая топологию приложения.

Приложение использует MSAL4J для входа пользователей и получения маркера идентификатора из Azure AD B2C. Маркер идентификатора подтверждает, что пользователь проходит проверку подлинности в клиенте Azure AD B2C.

Необходимые компоненты

Рекомендации

  • Некоторые знания о Java / Jakarta Servlets.
  • Некоторые знания о терминале Linux/OSX.
  • jwt.ms для проверки маркеров.
  • Fiddler для мониторинга активности сети и устранения неполадок.
  • Следуйте блогу по идентификатору Microsoft Entra ID, чтобы оставаться в курсе последних разработок.

Настройка примера

В следующих разделах показано, как настроить пример приложения.

Клонирование или скачивание примера репозитория

Чтобы клонировать пример, откройте окно Bash и выполните следующую команду:

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/1-Authentication/sign-in-b2c

Кроме того, перейдите к репозиторию ms-identity-msal-java-samples , а затем скачайте его в виде файла .zip и извлеките его на жесткий диск.

Внимание

Чтобы избежать ограничений длины пути к файлам в Windows, клонируйте или извлеките репозиторий в каталог рядом с корнем жесткого диска.

Регистрация примера приложения в клиенте Azure AD B2C

Пример поставляется с предварительно зарегистрированным приложением для тестирования. Если вы хотите использовать собственный клиент и приложение Azure AD B2C, выполните действия, описанные в следующих разделах, чтобы зарегистрировать и настроить приложение в портал Azure. В противном случае выполните действия для запуска примера.

Выберите клиент Azure AD B2C, в котором вы хотите создать приложения

Чтобы выбрать клиент, выполните следующие действия.

  1. Войдите на портал Azure.

  2. Если ваша учетная запись присутствует в нескольких клиентах Azure AD B2C, выберите профиль в углу портал Azure, а затем выберите "Переключить каталог", чтобы изменить сеанс на нужный клиент Azure AD B2C.

Создание потоков пользователей и настраиваемых политик

Сведения о создании общих потоков пользователей, таких как регистрация, вход, изменение профиля и сброс пароля, см. в руководстве по созданию потоков пользователей в Azure Active Directory B2C.

Вы также должны рассмотреть возможность создания настраиваемых политик в Azure Active Directory B2C , однако это выходит за рамки этого руководства.

Добавление внешних поставщиков удостоверений

См . руководство. Добавление поставщиков удостоверений в приложения в Azure Active Directory B2C.

Регистрация приложения (ms-identity-b2c-java-servlet-webapp-authentication)

Чтобы зарегистрировать приложение, выполните следующие действия.

  1. Перейдите к портал Azure и выберите Azure AD B2C.

  2. Выберите "Регистрация приложений" на панели навигации и выберите "Создать регистрацию".

  3. На появившемся экране "Регистрация приложения" введите следующие сведения о регистрации приложения:

    • В разделе "Имя" введите понятное имя приложения для отображения пользователям приложения, напримерms-identity-b2c-java-servlet-webapp-authentication.
    • В разделе "Поддерживаемые типы учетных записей" выберите учетные записи в любом каталоге организации и личных учетных записях Майкрософт (например, Skype, Xbox, Outlook.com).
    • В разделе URI перенаправления (необязательно) выберите веб-файл в поле со списком и введите следующий URI перенаправления: http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_redirect
  4. Выберите Зарегистрировать, чтобы создать приложение.

  5. На странице регистрации приложения найдите и скопируйте значение идентификатора приложения (клиента), которое будет использоваться позже. Это значение используется в файле конфигурации или файлах приложения.

  6. Выберите Сохранить, чтобы сохранить изменения.

  7. На странице регистрации приложения выберите сертификаты и секреты на панели навигации, чтобы открыть страницу, где можно создать секреты и отправить сертификаты.

  8. В разделе Секреты клиента выберите Создать секрет клиента.

  9. Введите описание, например секрет приложения.

  10. Выберите одну из доступных продолжительности: в течение 1 года, за 2 года или никогда не истекает.

  11. Выберите Добавить. Отображается созданное значение.

  12. Скопируйте и сохраните созданное значение для использования в последующих шагах. Это значение требуется для файлов конфигурации кода. Это значение не отображается снова, и его нельзя получить другими средствами. Таким образом, не забудьте сохранить его из портал Azure перед переходом на любой другой экран или область.

Настройка приложения (ms-identity-b2c-java-servlet-webapp-authentication) для использования регистрации приложения

Чтобы настроить приложение, выполните следующие действия.

Примечание.

В следующих шагах ClientID выполняется то же самое, что Application ID и AppId.

  1. Откройте проект в интегрированной среде разработки.

  2. Откройте файл ./src/main/resources/authentication.properties.

  3. aad.clientId Найдите свойство и замените существующее значение идентификатором приложения или clientId ms-identity-b2c-java-servlet-webapp-authentication приложением из портал Azure.

  4. aad.secret Найдите свойство и замените существующее значение значением, сохраненным во время создания ms-identity-b2c-java-servlet-webapp-authentication приложения из портал Azure.

  5. Найдите свойство и замените существующий aad.scopes идентификатор клиента приложения значением, помещенным aad.clientId на шаге 1 этого раздела.

  6. aad.authority Найдите свойство и замените первый экземпляр fabrikamb2c именем клиента Azure AD B2C, в котором вы создали ms-identity-b2c-java-servlet-webapp-authentication приложение в портал Azure.

  7. aad.authority Найдите свойство и замените второй экземпляр fabrikamb2c именем клиента Azure AD B2C, в котором вы создали ms-identity-b2c-java-servlet-webapp-authentication приложение в портал Azure.

  8. aad.signInPolicy Найдите свойство и замените его именем политики регистрации и входа в поток пользователя, созданной в клиенте Azure AD B2C, в котором вы создали ms-identity-b2c-java-servlet-webapp-authentication приложение в портал Azure.

  9. aad.passwordResetPolicy Найдите свойство и замените его именем политики сброса пароля, созданной в клиенте Azure AD B2C, в котором вы создали ms-identity-b2c-java-servlet-webapp-authentication приложение в портал Azure.

  10. aad.editProfilePolicy Найдите свойство и замените его именем политики редактирования пользовательского потока профиля, созданной в клиенте Azure AD B2C, в котором вы создали ms-identity-b2c-java-servlet-webapp-authentication приложение в портал Azure.

Сборка примера

Чтобы создать пример с помощью Maven, перейдите в каталог, содержащий файл pom.xml для примера, а затем выполните следующую команду:

mvn clean package

Эта команда создает WAR-файл , который можно запустить на различных серверах приложений.

Запуск примера

В этих инструкциях предполагается, что вы установили WebSphere и настроили сервер. Вы можете использовать руководство по развертыванию кластера WebSphere Application Server (традиционного) в Azure Виртуальные машины для базовой настройки сервера.

Перед развертыванием в WebSphere выполните следующие действия, чтобы внести некоторые изменения конфигурации в сам пример, а затем создать или перестроить пакет:

  1. Перейдите к файлу authentication.properties приложения и измените значение app.homePage URL-адреса сервера и номера порта, который вы планируете использовать, как показано в следующем примере:

    # app.homePage is by default set to dev server address and app context path on the server
    # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net
    app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/
    
  2. После сохранения этого файла используйте следующую команду, чтобы перестроить приложение:

    mvn clean package
    
  3. После завершения сборки кода скопируйте WAR-файл в файловую систему целевого сервера.

Кроме того, необходимо внести те же изменения в регистрацию приложения Azure, где вы задали его в портал Azure в качестве значения URI перенаправления на вкладке "Проверка подлинности".

  1. Перейдите на страницу Регистрация приложений Платформы удостоверений Майкрософт для разработчиков.

  2. Используйте поле поиска для поиска регистрации приложения, например java-servlet-webapp-authentication.

  3. Откройте регистрацию приложения, выбрав его имя.

  4. Выберите Проверка подлинности в меню.

  5. В разделе URI веб-перенаправления - выберите "Добавить URI".

  6. Заполните универсальный код ресурса (URI) приложения, добавив /auth/redirect , например https://<server-url>:<port-number>/auth/redirect.

  7. Выберите Сохранить.

Выполните следующие действия, чтобы развернуть пример с помощью консоли интегрированных решений WebSphere:

  1. На вкладке "Приложения" выберите "Новое приложение", а затем "Новое корпоративное приложение".

  2. Выберите созданный war-файл, а затем нажмите кнопку "Далее", пока не получите корень контекста карты для шага установки веб-модулей. Другие параметры по умолчанию должны быть хорошо.

  3. Для корневого каталога контекста задайте для него то же значение, что и после номера порта в URI перенаправления, заданном в примере конфигурации или регистрации приложения Azure. То есть, если URI перенаправления имеет значение http://<server-url>:9080/msal4j-servlet-auth/, корневой каталог контекста должен быть msal4j-servlet-auth.

  4. Выберите Готово.

  5. После завершения установки приложения перейдите в раздел корпоративных приложений WebSphere на вкладке "Приложения".

  6. Выберите war-файл, установленный в списке приложений, а затем нажмите кнопку "Начать развертывание".

  7. После завершения развертывания перейдите к http://<server-url>:9080/{whatever you set as the context root} нему и увидите приложение.

Анализ примера

Чтобы изучить пример, выполните следующие действия.

  1. Обратите внимание, что состояние входа или выхода отображается в центре экрана.
  2. Нажмите кнопку с учетом контекста в углу. Эта кнопка считывает вход при первом запуске приложения.
  3. На следующей странице следуйте инструкциям и войдите с учетной записью выбранного поставщика удостоверений.
  4. Обратите внимание, что кнопка с учетом контекста теперь говорит выход и отображает имя пользователя.
  5. Выберите сведения о маркере идентификатора, чтобы просмотреть некоторые декодированные утверждения маркера идентификатора.
  6. Вы также можете изменить свой профиль. Выберите ссылку, чтобы изменить сведения, такие как отображаемое имя, место проживания и профессия.
  7. Нажмите кнопку в углу, чтобы выйти из нее.
  8. После выхода перейдите по следующему URL-адресу для страницы сведений о токене: http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_token_details Здесь можно увидеть, как приложение отображает ошибку 401: unauthorized вместо утверждений маркера идентификатора.

Примечания о коде

В этом примере показано, как использовать MSAL4J для входа пользователей в клиент Azure AD B2C.

Содержимое

В следующей таблице показано содержимое папки примера проекта:

Файл или папка Description
AuthHelper.java Вспомогательные функции для проверки подлинности.
Config.java Выполняется при запуске и настраивает средство чтения свойств и средства ведения журнала.
authentication.properties Идентификатор и конфигурация программы Microsoft Entra.
AuthenticationFilter.java Перенаправляет запросы, не прошедшие проверку подлинности, на защищенные ресурсы на страницу 401.
MsalAuthSession Создается экземпляр с помощью экземпляра HttpSession. Хранит все атрибуты сеанса, связанные с MSAL, в атрибуте сеанса.
____Servlet.java Все доступные конечные точки определяются в классах .java, заканчивающиеся ____Servlet.java.
CHANGELOG.md Список изменений в примере.
CONTRIBUTING.md Рекомендации по участию в образце.
ЛИЦЕНЗИЯ Лицензия для примера.

ConfidentialClientApplication

ConfidentialClientApplication Экземпляр создается в файле AuthHelper.java, как показано в следующем примере. Этот объект помогает создать URL-адрес авторизации Azure AD B2C, а также помогает обмениваться маркером проверки подлинности для маркера доступа.

IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .b2cAuthority(AUTHORITY + policy)
                     .build();

Для создания экземпляров используются следующие параметры:

  • Идентификатор клиента приложения.
  • Секрет клиента, который является обязательным для конфиденциальных клиентских приложений.
  • Центр Azure AD B2C, объединенный с соответствующими UserFlowPolicy для регистрации, входа, редактирования профиля или сброса пароля.

В этом примере эти значения считываются из файла authentication.properties с помощью средства чтения свойств в файле Config.java .

Пошаговое руководство

Ниже приведены пошаговые инструкции по функциональным возможностям приложения:

  1. Первым шагом процесса входа является отправка запроса /authorize в конечную точку клиента Azure Active Directory B2C. Экземпляр MSAL4J ConfidentialClientApplication используется для создания URL-адреса запроса авторизации, а приложение перенаправляет браузер на этот URL-адрес, как показано в следующем примере:

    final ConfidentialClientApplication client = getConfidentialClientInstance(policy);
    final AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters
        .builder(REDIRECT_URI, Collections.singleton(SCOPES)).responseMode(ResponseMode.QUERY)
        .prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String redirectUrl = client.getAuthorizationRequestUrl(parameters).toString();
    Config.logger.log(Level.INFO, "Redirecting user to {0}", redirectUrl);
    resp.setStatus(302);
    resp.sendRedirect(redirectUrl);
    

    В следующем списке описываются функции этого кода:

    • AuthorizationRequestUrlParameters: параметры, которые должны быть заданы для сборки AuthorizationRequestUrl.

    • REDIRECT_URI: где Azure AD B2C перенаправляет браузер вместе с кодом проверки подлинности после сбора учетных данных пользователя.

    • SCOPES: области — это разрешения, запрашиваемые приложением.

      Как правило, три области openid profile offline_access достаточно для получения ответа маркера идентификатора. Однако MSAL4J требует, чтобы все ответы от Azure AD B2C также содержали маркер доступа.

      Чтобы Azure AD B2C раздавал маркер доступа, а также маркер идентификатора, запрос должен включать дополнительную область ресурсов. Так как для получения маркера доступа приложение фактически не требует внешней области ресурсов, он добавляет собственный идентификатор клиента в качестве четвертой области.

      Полный список областей, запрашиваемых приложением, можно найти в файле authentication.properties .

    • ResponseMode.QUERY: Azure AD B2C может возвращать ответ в виде параметров формы в HTTP-запросе POST или в качестве строковых параметров в HTTP-запросе GET.

    • Prompt.SELECT_ACCOUNT: Azure AD B2C должен попросить пользователя выбрать учетную запись, которую они намерены пройти проверку подлинности.

    • state: уникальная переменная, заданная приложением в сеансе по каждому запросу маркера и уничтоженная после получения соответствующего обратного вызова перенаправления Azure AD B2C. Переменная состояния гарантирует, что запросы Azure AD B2C к /auth_redirect endpoint этим приложениям фактически относятся к запросам авторизации Azure AD B2C, исходящим из этого приложения и этого сеанса, тем самым предотвращая атаки CSRF. Это делается в файле AADRedirectServlet.java .

    • nonce: уникальная переменная, установленная приложением в сеанс по каждому запросу токена, и уничтожена после получения соответствующего токена. Этот параметр не используется для транскрибирования в результирующий маркеры azure AD B2C, тем самым обеспечивая отсутствие атаки на воспроизведение маркеров.

  2. Пользователь предоставляет запрос на вход в Azure Active Directory B2C. Если попытка входа выполнена успешно, браузер пользователя перенаправляется в конечную точку перенаправления приложения. Допустимый запрос к этой конечной точке содержит код авторизации.

  3. Затем ConfidentialClientApplication экземпляр обменивается этим кодом авторизации для маркера идентификатора и маркера доступа из Azure Active Directory B2C, как показано в следующем примере:

    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                        .builder(authCode, new URI(REDIRECT_URI))
                        .scopes(Collections.singleton(SCOPES)).build();
    
    final ConfidentialClientApplication client = AuthHelper
            .getConfidentialClientInstance(policy);
    final Future<IAuthenticationResult> future = client.acquireToken(authParams);
    final IAuthenticationResult result = future.get();
    

    В следующем списке описываются функции этого кода:

    • AuthorizationCodeParameters: параметры, которые необходимо задать для обмена кодом авторизации для идентификатора и (или) маркера доступа.
    • authCode: код авторизации, полученный в конечной точке перенаправления.
    • REDIRECT_URI: URI перенаправления, используемый на предыдущем шаге, должен быть передан еще раз.
    • SCOPES: области, используемые на предыдущем шаге, должны быть переданы снова.
  4. В acquireToken случае успешного выполнения утверждения маркера извлекаются, а утверждение nonce проверяется в соответствии с нецем, хранящимся в сеансе, как показано в следующем примере:

    parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache);
    validateNonce(msalAuth)
    processSuccessfulAuthentication(msalAuth);
    
  5. Если неисключение успешно проверено, состояние проверки подлинности помещается в сеанс на стороне сервера, используя методы, предоставляемые MsalAuthSession классом, как показано в следующем примере:

    msalAuth.setAuthenticated(true);
    msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
    

Дополнительные сведения

Дополнительные сведения о работе протоколов OAuth 2.0 в этом сценарии и других сценариях см. в сценариях проверки подлинности для идентификатора Microsoft Entra.

Следующий шаг

Развертывание приложений Java WebSphere в Традиционном вебсфере в Azure Виртуальные машины