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


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

В этой статье показано приложение Java JBoss EAP, которое проверяет подлинность пользователей в 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-файл , который можно запустить на различных серверах приложений.

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

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

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

Настройка подключаемого модуля Maven

Процесс развертывания для службы приложение Azure использует учетные данные Azure из Azure CLI автоматически. Если Azure CLI не установлен локально, подключаемый модуль Maven проходит проверку подлинности с помощью OAuth или входа устройства. Дополнительные сведения см. в статье о проверке подлинности с помощью подключаемых модулей Maven.

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

  1. Выполните команду Maven, показанную рядом с настройкой развертывания. Эта команда помогает настроить Служба приложений операционную систему, версию Java и версию Tomcat.

    mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config
    
  2. Для создания конфигурации запуска нажмите клавишу Y, а затем нажмите клавишу ВВОД.

  3. Для определения значения ос нажмите клавишу 2 для Linux, а затем нажмите клавишу ВВОД.

  4. Для определения значения javaVersion нажмите клавишу 2 для Java 11, а затем нажмите клавишу ВВОД.

  5. Для определения значения для webContainer нажмите клавишу 1 для JBosseap7, а затем нажмите клавишу ВВОД.

  6. Чтобы определить значение для ценообразования, нажмите клавишу ВВОД, чтобы выбрать уровень P1v3 по умолчанию.

  7. Для подтверждения нажмите клавишу Y, а затем нажмите клавишу ВВОД.

В следующем примере показаны выходные данные процесса развертывания:

Please confirm webapp properties
AppName : msal4j-servlet-auth-1707220080695
ResourceGroup : msal4j-servlet-auth-1707220080695-rg
Region : centralus
PricingTier : P1v3
OS : Linux
Java Version: Java 11
Web server stack: JBosseap 7
Deploy to slot : false
Confirm (Y/N) [Y]:
[INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  26.196 s
[INFO] Finished at: 2024-02-06T11:48:16Z
[INFO] ------------------------------------------------------------------------

После подтверждения выбора подключаемый модуль добавляет конфигурацию подключаемого модуля и необходимые параметры в файл pom.xml проекта, чтобы настроить приложение для запуска в службе приложение Azure.

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

<build>
    <plugins>
        <plugin>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>>azure-webapp-maven-plugin</artifactId>
            <version>x.xx.x</version>
            <configuration>
                <schemaVersion>v2</schemaVersion>
                <resourceGroup>your-resourcegroup-name</resourceGroup>
                <appName>your-app-name</appName>
            ...
            </configuration>
        </plugin>
    </plugins>
</build>

Конфигурации для Служба приложений можно изменить непосредственно в pom.xml. Некоторые распространенные конфигурации перечислены в следующей таблице:

Свойство Обязательное поле Описание Версия
schemaVersion false Версия схемы конфигурации. Поддерживаемые значения: v1 и v2. 1.5.2
subscriptionId false Идентификатор подписки. Версия 0.1.0 и выше
resourceGroup true Группа ресурсов Azure для приложения. Версия 0.1.0 и выше
appName true Имя приложения. Версия 0.1.0 и выше
region false Регион, в котором размещается приложение. Значение по умолчанию — centralus. Допустимые регионы см. в разделе "Поддерживаемые регионы". Версия 0.1.0 и выше
pricingTier false Ценовая категория приложения. Значение по умолчанию — P1v2 для рабочей нагрузки. Рекомендуемое минимальное значение для разработки и тестирования Java.B2 Дополнительные сведения см. на странице цен на службу приложений. Версия 0.1.0 и выше
runtime false Конфигурация среды выполнения. Дополнительные сведения см. в разделе Дополнительные сведения о конфигурации. Версия 0.1.0 и выше
deployment false Конфигурация развертывания. Дополнительные сведения см. в разделе Дополнительные сведения о конфигурации. Версия 0.1.0 и выше

Полный список конфигураций см. в справочной документации по подключаемым модулям. Все подключаемые модули Azure Maven используют общий набор конфигураций. Сведения об этих конфигурациях см. в разделе "Общие конфигурации". Сведения о конфигурациях, относящихся к службе приложение Azure, см. в приложении Azure: сведения о конфигурации.

Не забудьте сохранить в стороне appName и resourceGroup значения для последующего использования.

Подготовка приложения к развертыванию

При развертывании приложения в Служба приложений URL-адрес перенаправления изменяется на URL-адрес перенаправления развернутого экземпляра приложения. Чтобы изменить эти параметры в файле свойств, выполните следующие действия.

  1. Перейдите к файлу authentication.properties приложения и измените значение app.homePage имени домена развернутого приложения, как показано в следующем примере. Например, если вы выбрали example-domain имя приложения на предыдущем шаге, необходимо использовать https://example-domain.azurewebsites.net для app.homePage значения. Убедитесь, что вы также изменили протокол на http https.

    # 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://<your-app-name>.azurewebsites.net
    
  2. После сохранения этого файла используйте следующую команду, чтобы перестроить приложение:

    mvn clean package
    

Внимание

В этом же файле authentication.properties у вас есть параметр aad.secret. Это не рекомендуется развертывать это значение в Служба приложений. Не рекомендуется оставить это значение в коде и потенциально отправить его в репозиторий Git. Чтобы удалить это значение секрета из кода, см. более подробные инструкции в разделе "Развертывание в Служба приложений. Удаление секрета". В этом руководстве добавлены дополнительные шаги для отправки значения секрета в Key Vault и использования ссылок на Key Vault.

Обновление регистрации приложения идентификатора Microsoft Entra

Так как URI перенаправления изменяется в развернутом приложении в службе приложение Azure, необходимо также изменить URI перенаправления в регистрации приложения Идентификатора Microsoft Entra. Чтобы внести это изменение, выполните следующие действия:

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

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

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

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

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

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

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

Развертывание приложения

Теперь вы готовы развернуть приложение в службе приложение Azure. Используйте следующую команду, чтобы убедиться, что вы вошли в среду Azure для выполнения развертывания:

az login

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

mvn package azure-webapp:deploy

После завершения развертывания приложение будет готово http://<your-app-name>.azurewebsites.net/. Откройте URL-адрес в локальном веб-браузере, где должна появиться начальная страница msal4j-servlet-auth приложения.

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

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

  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.