Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано Java-приложение для JBoss EAP, которое выполняет аутентификацию пользователей с помощью Azure Active Directory B2C (Azure AD B2C), используя Microsoft Authentication Library for Java (MSAL4J).
Примечание.
По состоянию на 1 мая 2025 г. Azure Active Directory B2C больше не доступен для покупки для новых клиентов. Существующие клиенты могут продолжать использовать Azure AD B2C с поддержкой, предоставленной по крайней мере до мая 2030 года. Для новых проектов по управлению удостоверениями клиентов и доступом (CIAM) используйте вместо этого Внешняя идентификация Microsoft Entra.
На следующей схеме показана топология приложения:
Схема, показывающая топологию приложения.
Приложение использует MSAL4J для входа пользователей в систему и получения токена идентификации из Azure AD B2C. Токен идентификации подтверждает, что пользователь прошёл проверку подлинности в тенанте Azure AD B2C.
Предварительные требования
- JDK версии 8 или выше
- Maven 3
- Клиент Azure AD B2C. Дополнительные сведения см. в статье Руководство. Создание клиента Azure Active Directory B2C
- Учетная запись пользователя в клиенте Azure AD B2C.
- JBoss EAP
- Visual Studio Code
- Инструменты Azure для Visual Studio Code
Рекомендации
- Некоторое знакомство с Java / Jakarta Servlets.
- Некоторые знания о терминале Linux/OSX.
- jwt.ms для проверки ваших токенов.
- Fiddler для мониторинга сетевой активности и устранения неполадок.
- Подписывайтесь на блог Microsoft Entra, чтобы быть в курсе последних обновлений.
Настройка примера
В следующих разделах показано, как настроить пример приложения.
Клонирование или скачивание примера репозитория
Чтобы клонировать пример, откройте окно 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, в котором вы хотите создать приложения
Чтобы выбрать арендатора, выполните следующие действия:
Войдите в портал Azure.
Если ваша учетная запись присутствует в нескольких арендаторах 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)
Чтобы зарегистрировать приложение, выполните следующие действия.
Перейдите на портал Azure и выберите Azure AD B2C.
Выберите "Регистрация приложений" на панели навигации и выберите "Создать регистрацию".
На появившейся странице Регистрация приложения введите следующие данные для регистрации приложения:
- В разделе Name введите осмысленное имя приложения, которое будет отображаться пользователям приложения, — например, .
- В разделе "Поддерживаемые типы учетных записей" выберите учетные записи в любом каталоге организации и личных учетных записях Майкрософт (например, Skype, Xbox, Outlook.com).
- В разделе URI перенаправления (необязательно) выберите Интернет в раскрывающемся списке и введите следующий URI перенаправления:
Выберите Зарегистрировать, чтобы создать приложение.
На странице регистрации приложения найдите и скопируйте значение идентификатора приложения (клиента), которое будет использоваться позже. Это значение используется в файле конфигурации или файлах приложения.
Выберите Сохранить, чтобы сохранить изменения.
На странице регистрации приложения выберите сертификаты и секреты на панели навигации, чтобы открыть страницу, где можно создать секреты и отправить сертификаты.
В разделе Секреты клиента выберите Создать секрет клиента.
Введите описание — например, секрет приложения.
Выберите срок истечения действия секрета или укажите пользовательский срок его существования. Секреты клиента ограничены максимальным сроком существования 24 месяцев, и Microsoft рекомендует срок действия менее 12 месяцев. Для боевых приложений предпочтительнее использовать сертификат или учетные данные федеративной идентификации вместо секрета клиента.
Выберите Добавить. Отображается созданное значение.
Скопируйте и сохраните созданное значение для использования в последующих шагах. Это значение требуется для файлов конфигурации кода. Это значение не отображается снова, и его нельзя получить другими средствами. Поэтому обязательно сохраните его в портале Azure, прежде чем перейдёте на любой другой экран или панель.
Настройте приложение (ms-identity-b2c-java-servlet-webapp-authentication) для использования регистрации приложения
Чтобы настроить приложение, выполните следующие действия.
Примечание.
В следующих шагах — это то же самое, что и или .
Откройте проект в интегрированной среде разработки.
Откройте файл ./src/main/resources/authentication.properties.
Найдите свойство и замените существующее значение на идентификатор приложения или приложения с портала Azure.
Найдите свойство
aad.secretи замените существующее значение на значение, которое вы сохранили при создании приложенияms-identity-b2c-java-servlet-webapp-authenticationв портале Azure.Найдите свойство и замените существующий clientId приложения на значение, которое вы указали в на шаге 1 этого раздела.
Найдите свойство и замените первое вхождение на имя клиента Azure AD B2C, в котором вы создали приложение на портале Azure.
Найдите свойство
aad.authorityи замените второе вхождениеfabrikamb2cименем арендатора Azure AD B2C, в котором вы создали приложениеms-identity-b2c-java-servlet-webapp-authenticationв портале Azure.Найдите свойство и замените его именем политики пользовательского потока регистрации и входа, которую вы создали в клиенте Azure AD B2C, где вы создали приложение в портале Azure.
Найдите свойство и замените его именем политики пользовательского потока сброса пароля, которую вы создали в арендаторе Azure AD B2C, где вы создали приложение на портале Azure.
Найдите свойство и замените его именем политики пользовательского потока редактирования профиля, созданной в арендаторе Azure AD B2C, в котором вы создали приложение на портале Azure.
Соберите пример
Чтобы создать пример с помощью Maven, перейдите в каталог, содержащий файл pom.xml для примера, а затем выполните следующую команду:
mvn clean package
Эта команда создает WAR-файл , который можно запустить на различных серверах приложений.
Запустите пример
- Развертывание в Служба приложений Azure
- Запуск локально
В следующих разделах описано, как развернуть пример в Службе приложений Azure.
Предварительные требования
Плагин Maven для приложений Служба приложений Azure
Если Maven не является вашим предпочтительным средством разработки, ознакомьтесь со следующими руководствами, которые используют другие инструменты:
- IntelliJ IDEA
- Eclipse
- Visual Studio Code
Настройте плагин Maven
Процесс развертывания в Служба приложений Azure автоматически использует ваши учетные данные Azure из Azure CLI. Если Azure CLI не установлен локально, то плагин Maven выполняет аутентификацию с помощью OAuth или входа с помощью кода устройства. Дополнительные сведения см. в разделе аутентификация в подключаемых модулях Maven.
Чтобы настроить подключаемый модуль, выполните следующие действия.
Выполните команду Maven, показанную рядом с настройкой развертывания. Эта команда помогает настроить операционную систему службы приложений App Service, версию Java и версию Tomcat.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:configДля Создать новую конфигурацию запуска нажмите Y, затем нажмите Enter.
Для указания значения для OS нажмите 2 для Linux, затем нажмите Enter.
Для определения значения javaVersion нажмите 2 для Java 11, затем нажмите Enter.
Для параметра Define value for webContainer нажмите 1 для JBosseap7, затем нажмите Enter.
Чтобы задать значение для pricingTier, нажмите Enter, чтобы выбрать уровень P1v3 по умолчанию.
Для подтверждения нажмите Y, затем нажмите Enter.
В следующем примере показаны выходные данные процесса развертывания:
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>
Параметры конфигурации для App Service можно изменить непосредственно в pom.xml. Некоторые распространенные конфигурации перечислены в следующей таблице:
| Свойство | Обязательное поле | Описание | Версия |
|---|---|---|---|
schemaVersion |
false | Версия схемы конфигурации. Поддерживаемые значения — и . | 1.5.2 |
subscriptionId |
false | Идентификатор подписки. | Версия 0.1.0 и выше |
resourceGroup |
true | Группа ресурсов Azure для приложения. | Версия 0.1.0 и выше |
appName |
true | Имя приложения. | Версия 0.1.0 и выше |
region |
false | Регион, в котором размещается приложение. Значение по умолчанию — . Допустимые регионы см. в разделе Поддерживаемые регионы. | Версия 0.1.0 и выше |
pricingTier |
false | Ценовая категория приложения. Значение по умолчанию — P1v2 для рабочей нагрузки. Рекомендуемое минимальное значение для разработки и тестирования Java — . Дополнительные сведения см. в разделе Сведения о ценах на службу приложений | Версия 0.1.0 и выше |
runtime |
false | Конфигурация среды выполнения. Дополнительные сведения см. в разделе Сведения о конфигурации. | Версия 0.1.0 и выше |
deployment |
false | Конфигурация развертывания. Дополнительные сведения см. в разделе Сведения о конфигурации. | Версия 0.1.0 и выше |
Полный список конфигураций см. в справочной документации по подключаемым модулям. Все плагины Azure Maven имеют общий набор параметров конфигурации. Сведения об этих конфигурациях см. в разделе Общие конфигурации. Сведения о конфигурациях для Служба приложений Azure см. в разделе Приложение Azure: сведения о конфигурации.
Не забудьте сохранить отдельно значения и для дальнейшего использования.
Подготовка приложения к развертыванию
Когда вы развертываете свое приложение в App Service, URL-адрес перенаправления меняется на URL-адрес перенаправления развернутого экземпляра вашего приложения. Чтобы изменить эти параметры в файле свойств, выполните следующие действия.
Откройте файл authentication.properties вашего приложения и измените значение на доменное имя вашего развернутого приложения, как показано в следующем примере. Например, если на предыдущем шаге вы выбрали в качестве имени приложения, то теперь необходимо использовать в качестве значения . Убедитесь, что вы также изменили протокол с на .
# 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После сохранения этого файла используйте следующую команду, чтобы перестроить приложение:
mvn clean package
Внимание
В этом же файле authentication.properties у вас есть параметр для . Не рекомендуется развертывать это значение в Службе приложений. Также не стоит оставлять это значение в коде и затем отправлять его в свой репозиторий Git. Чтобы удалить это секретное значение из кода, дополнительные рекомендации см. в разделе Развертывание в App Service — удаление секрета. Это руководство содержит дополнительные шаги для добавления значения секрета в Key Vault и использования ссылок на Key Vault.
Обновление регистрации приложения идентификатора Microsoft Entra
Поскольку URI перенаправления меняется на URI вашего приложения, развернутого в Служба приложений Azure, вам также необходимо изменить URI перенаправления в регистрации приложения Microsoft Entra ID. Чтобы внести это изменение, выполните следующие действия:
Перейдите на страницу Регистрация приложений платформы идентификации Microsoft для разработчиков.
Используйте поле поиска, чтобы найти регистрацию своего приложения, например, .
Откройте регистрацию приложения, выбрав его имя.
Выберите Проверка подлинности в меню.
В разделе WebRedirect URIs выберите Add URI.
Укажите URI приложения, добавив в конец — например, .
Выберите Сохранить.
Развертывание приложения
Теперь вы готовы развернуть приложение в службе приложение Azure. Используйте следующую команду, чтобы убедиться, что вы вошли в среду Azure для выполнения развертывания:
az login
Когда вся конфигурация будет готова в файле pom.xml, вы сможете использовать следующую команду для развертывания Java-приложения в Azure:
mvn package azure-webapp:deploy
После завершения развертывания приложение будет доступно по адресу . Откройте URL-адрес в локальном браузере, в котором должна отображаться стартовая страница приложения .
Анализ примера
Чтобы изучить пример, выполните следующие действия.
- Обратите внимание, что состояние входа или выхода отображается в центре экрана.
- Выберите контекстно-зависимую кнопку в углу. При первом запуске приложения на этой кнопке отображается надпись Войти.
- На следующей странице следуйте инструкциям и войдите с учетной записью выбранного поставщика удостоверений.
- Обратите внимание, что на контекстно-зависимой кнопке теперь отображается надпись Выйти, а также ваше имя пользователя.
- Выберите Сведения о маркере ID, чтобы просмотреть некоторые декодированные утверждения маркера ID.
- Вы также можете изменить свой профиль. Выберите ссылку, чтобы изменить сведения, такие как отображаемое имя, место проживания и профессия.
- Используйте кнопку в углу, чтобы выйти из системы.
- После выхода из системы перейдите по следующему URL-адресу на страницу сведений о токене: . Здесь можно увидеть, как приложение отображает ошибку вместо утверждений токена ID.
О коде
В этом примере показано, как использовать MSAL4J для входа пользователей в клиент Azure AD B2C.
Содержимое
В следующей таблице показано содержимое папки примера проекта:
| Файл или папка | Описание |
|---|---|
| AuthHelper.java | Вспомогательные функции для проверки подлинности. |
| Config.java | Выполняется при запуске и настраивает средство чтения свойств и средства ведения журнала. |
| authentication.properties | Идентификатор и конфигурация программы Microsoft Entra. |
| AuthenticationFilter.java | Перенаправляет запросы, не прошедшие проверку подлинности, на защищенные ресурсы на страницу 401. |
| MsalAuthSession | Создается с помощью . Хранит все атрибуты сеанса, связанные с MSAL, в атрибуте сеанса. |
| *Servlet.java | Все доступные конечные точки определяются в классах Java с именами, заканчивающимися Servlet.. |
| CHANGELOG.md | Список изменений в примере. |
| CONTRIBUTING.md | Рекомендации по участию в образце. |
| ЛИЦЕНЗИЯ | Лицензия на образец. |
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, объединенный с соответствующим для регистрации, входа, редактирования профиля или сброса пароля.
В этом примере эти значения считываются из файла authentication.properties с помощью средства чтения свойств в файле Config.java .
Пошаговое руководство
Ниже приведены пошаговые инструкции по функциональным возможностям приложения:
Первым шагом в процессе входа является отправка запроса к конечной точке для вашего арендатора Azure Active Directory B2C. Экземпляр MSAL4J используется для формирования 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);В следующем списке описываются функции этого кода:
: параметры, которые необходимо задать для формирования AuthorizationRequestUrl.
: куда Azure AD B2C перенаправляет браузер вместе с кодом авторизации после получения учетных данных пользователя.
: Области действия — это разрешения, запрашиваемые приложением.
Как правило, для получения ответа с токеном идентификации достаточно трёх областей действия . Однако MSAL4J требует, чтобы все ответы от Azure AD B2C также содержали маркер доступа.
Чтобы Azure AD B2C мог выдавать токен доступа, а также токен идентификации, запрос должен включать дополнительную область ресурса. Поскольку этому приложению фактически не требуется внешняя область ресурса, оно добавляет собственный идентификатор клиента в качестве четвертой области, чтобы получить маркер доступа.
Полный список областей, запрашиваемых приложением, можно найти в файле authentication.properties .
: Azure AD B2C может возвращать ответ в виде параметров формы в HTTP-запросе методом POST или в виде параметров строки запроса в HTTP-запросе методом GET.
: Azure AD B2C должен предложить пользователю выбрать учетную запись, с помощью которой он хочет пройти проверку подлинности.
: уникальная переменная, которую приложение устанавливает в сеансе при каждом запросе токена и удаляет после получения соответствующего обратного вызова перенаправления Azure AD B2C. Переменная состояния гарантирует, что запросы Azure AD B2C к действительно являются запросами на авторизацию Azure AD B2C, исходящими из этого приложения и этого сеанса, тем самым предотвращая атаки CSRF. Это выполняется в файле AADRedirectServlet.java.
: уникальная переменная, которая устанавливается приложением в сессию при каждом запросе токена и удаляется после получения соответствующего токена. Этот nonce включается в результирующие токены, выдаваемые Azure AD B2C, тем самым гарантируя отсутствие атаки повторного использования токена.
Пользователю отображается запрос на вход от Azure Active Directory B2C. Если попытка входа выполнена успешно, браузер пользователя перенаправляется в конечную точку перенаправления приложения. Допустимый запрос к этой конечной точке содержит код авторизации.
Затем экземпляр обменивает этот код авторизации на ID-токен и токен доступа от 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();В следующем списке описываются функции этого кода:
- : Параметры, которые необходимо задать, чтобы обменять код авторизации на ID и/или маркер доступа.
- : код авторизации, который был получен в конечной точке перенаправления.
- : URI перенаправления, который использовался на предыдущем шаге, необходимо снова передать.
- : Области действия, использованные на предыдущем шаге, необходимо снова передать.
Если выполняется успешно, из маркера извлекаются утверждения, а утверждение nonce проверяется по значению nonce, хранящемуся в сеансе, как показано в следующем примере:
parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache); validateNonce(msalAuth) processSuccessfulAuthentication(msalAuth);Если значение nonce успешно проверено, статус аутентификации сохраняется в сеансе на стороне сервера с использованием методов, предоставляемых классом , как показано в следующем примере:
msalAuth.setAuthenticated(true); msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
Дополнительные сведения
- Что такое Azure Active Directory B2C?
- Типы приложений, которые можно использовать в Active Directory B2C
- Рекомендации и лучшие методики для Azure Active Directory B2C
- Сеанс Azure AD B2C
- Библиотека аутентификации Microsoft (MSAL) для Java
Дополнительные сведения о том, как работают протоколы OAuth 2.0 в этом и других сценариях, см. в Сценарии проверки подлинности для Microsoft Entra ID.