Защита приложений Java Spring Boot с помощью Azure Active Directory B2C
В этой статье показано веб-приложение Java Spring Boot, которое входит в систему пользователей в клиенте Azure Active Directory B2C с помощью клиентской библиотеки Azure AD B2C Spring Boot Starter для Java. Он использует протокол OpenID Connect.
На следующей схеме показана топология приложения:
Схема, показывющая топологию приложения.
Клиентское приложение использует клиентская библиотека Azure AD B2C Spring Boot Starter для Java для входа пользователя и получения маркера идентификатора из Azure AD B2C. Маркер идентификатора подтверждает, что пользователь проходит проверку подлинности с помощью Azure AD B2C и позволяет пользователю получать доступ к защищенным маршрутам.
Необходимые компоненты
- JDK версии 15. Этот пример был разработан в системе с Java 15, но он может быть совместим с другими версиями.
- Maven 3
- Пакет расширений Java для Visual Studio Code рекомендуется запустить этот пример в Visual Studio Code.
- Клиент Azure AD B2C. Дополнительные сведения см. в руководстве по созданию клиента Azure Active Directory B2C
- Visual Studio Code
- Инструменты Azure для Visual Studio Code
Рекомендации
- Некоторые знания о Spring Framework.
- Некоторые знания о терминале Linux/OSX.
- jwt.ms для проверки маркеров.
- Fiddler для мониторинга активности сети и устранения неполадок.
- Следуйте блогу по идентификатору Microsoft Entra ID, чтобы оставаться в курсе последних разработок.
Настройка примера
В следующих разделах показано, как настроить пример приложения.
Клонирование или скачивание примера репозитория
Чтобы клонировать пример, откройте окно Bash и выполните следующую команду:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/1-Authentication/sign-in-b2c
Кроме того, перейдите к репозиторию ms-identity-msal-java-samples , а затем скачайте его в виде файла .zip и извлеките его на жесткий диск.
Внимание
Чтобы избежать ограничений длины пути к файлам в Windows, клонируйте или извлеките репозиторий в каталог рядом с корнем жесткого диска.
Этот пример поставляется с предварительно зарегистрированным приложением для демонстрационных целей. Если вы хотите использовать собственный клиент и приложение Azure AD B2C, зарегистрируйте и настройте приложение в портал Azure. Дополнительные сведения см. в разделе "Регистрация приложения ". В противном случае выполните действия, описанные в разделе "Запуск примера ".
Выберите клиент Azure AD B2C, в котором вы хотите создать приложения
Чтобы выбрать клиент, выполните следующие действия.
Войдите на портал Azure.
Если ваша учетная запись присутствует в нескольких клиентах Azure AD B2C, выберите профиль в углу портал Azure, а затем выберите "Переключить каталог", чтобы изменить сеанс на нужный клиент Azure AD B2C.
Создание потоков пользователей и настраиваемых политик
Сведения о создании общих потоков пользователей, таких как регистрация, вход, изменение профиля и сброс пароля, см. в руководстве по созданию потоков пользователей в Azure Active Directory B2C.
Кроме того, следует рассмотреть возможность создания настраиваемых политик в Azure Active Directory B2C. Однако эта задача выходит за рамки этого руководства. Дополнительные сведения см. в обзоре пользовательской политики Azure AD B2C.
Добавление внешних поставщиков удостоверений
См . руководство. Добавление поставщиков удостоверений в приложения в Azure Active Directory B2C.
Регистрация приложения (java-spring-webapp-auth-b2c)
Чтобы зарегистрировать приложение, выполните следующие действия.
Перейдите к портал Azure и выберите Azure AD B2C.
Выберите "Регистрация приложений" на панели навигации и выберите "Создать регистрацию".
На появившемся экране "Регистрация приложения" введите следующие сведения о регистрации приложения:
- В разделе "Имя" введите понятное имя приложения для отображения пользователям приложения, например
java-spring-webapp-auth-b2c
. - В области Поддерживаемые типы учетных записей выберите Учетные записи в любом поставщике удостоверений или в организационном каталоге (для аутентификации пользователей с помощью потока пользователей).
- В разделе URI перенаправления (необязательно) выберите веб-файл в поле со списком и введите следующий URI перенаправления:
http://localhost:8080/login/oauth2/code/
- В разделе "Имя" введите понятное имя приложения для отображения пользователям приложения, например
Выберите Зарегистрировать, чтобы создать приложение.
На странице регистрации приложения найдите и скопируйте значение идентификатора приложения (клиента), которое будет использоваться позже. Это значение используется в файле конфигурации или файлах приложения.
Выберите Сохранить, чтобы сохранить изменения.
На странице регистрации приложения выберите область "Сертификаты и секреты " на панели навигации, чтобы открыть страницу для создания секретов и отправки сертификатов.
В разделе Секреты клиента выберите Создать секрет клиента.
Введите описание, например секрет приложения.
Выберите одну из доступных длительности в отношении ваших проблем безопасности, например, в течение 2 лет.
Выберите Добавить. Отображается созданное значение.
Скопируйте и сохраните созданное значение для использования в последующих шагах. Это значение требуется для файлов конфигурации кода. Это значение не отображается снова, и его нельзя получить другими средствами. Таким образом, не забудьте сохранить его из портал Azure перед переходом на любой другой экран или область.
Настройка приложения (java-spring-webapp-auth-b2c) для использования регистрации приложения
Чтобы настроить приложение, выполните следующие действия.
Примечание.
В следующих шагах ClientID
выполняется то же самое, что Application ID
и AppId
.
Откройте проект в интегрированной среде разработки.
Откройте файл src/main/resources/application.yml.
client-id
Найдите свойство и замените существующее значение идентификатором приложения илиclientId
java-spring-webapp-auth-b2c
приложением из портал Azure.client-secret
Найдите свойство и замените существующее значение значением, сохраненным во время созданияjava-spring-webapp-auth-b2c
приложения из портал Azure.base-uri
Найдите свойство и замените два экземпляра значенияfabrikamb2c
именем клиента Azure AD B2C, в котором вы создалиjava-spring-webapp-auth-b2c
приложение в портал Azure.sign-up-or-sign-in
Найдите свойство и замените его именем политики регистрации и входа в поток пользователя, созданной в клиенте Azure AD B2C, в котором вы создалиjava-spring-webapp-auth-b2c
приложение в портал Azure.profile-edit
Найдите свойство и замените его именем политики сброса пароля, созданной в клиенте Azure AD B2C, в котором вы создалиjava-spring-webapp-auth-b2c
приложение в портал Azure.password-reset
Найдите свойство и замените его именем политики редактирования пользовательского потока профиля, созданной в клиенте Azure AD B2C, в котором вы создалиjava-spring-webapp-auth-b2c
приложение в портал Azure.Откройте файл src/main/resources/templates/navbar.html.
Найдите ссылки на
b2c_1_susi
потоки и замените их вашимиsign-up-sign-in
иprofile-edit
b2c_1_edit_profile
пользовательскими потоками.
Запуск примера
В следующих разделах показано, как развернуть пример в приложениях контейнеров Azure.
Необходимые компоненты
- Учетная запись Azure. Если ее нет, создайте бесплатную учетную запись. Вам понадобятся права
Contributor
илиOwner
в подписке Azure, чтобы продолжить. Дополнительные сведения см. в разделе Назначение ролей Azure с помощью портала Azure. - Интерфейс командной строки Azure.
- Расширение ИНТЕРФЕЙСА командной строки для приложений контейнеров Azure или более поздней версии
0.3.47
. Чтобы установить последнюю версию, используйтеaz extension add --name containerapp --upgrade --allow-preview
команду. - Пакет средств разработки Java версии 17 или более поздней.
- Maven.
Подготовка проекта Spring
Чтобы подготовить проект, выполните следующие действия.
Чтобы создать проект, используйте следующую команду Maven :
mvn clean verify
Запустите пример проекта локально с помощью следующей команды:
mvn spring-boot:run
Настройка
Чтобы войти в Azure из ИНТЕРФЕЙСА командной строки, выполните следующую команду и следуйте инструкциям, чтобы завершить процесс проверки подлинности.
az login
Чтобы убедиться, что вы используете последнюю версию интерфейса командной строки, выполните команду обновления.
az upgrade
Затем установите или обновите расширение "Приложения контейнеров Azure" для интерфейса командной строки.
Если при выполнении az containerapp
команд в Azure CLI возникают ошибки, связанные с отсутствующими параметрами, убедитесь, что установлена последняя версия расширения azure Container Apps.
az extension add --name containerapp --upgrade
Примечание.
Начиная с мая 2024 г. расширения Azure CLI больше не поддерживают предварительные версии функций по умолчанию. Чтобы получить доступ к функциям предварительной версии контейнерных приложений, установите расширение "Приложения контейнеров" с --allow-preview true
помощью .
az extension add --name containerapp --upgrade --allow-preview true
Теперь, когда установлено текущее расширение или модуль, зарегистрируйте Microsoft.App
пространства имен и Microsoft.OperationalInsights
пространств имен.
Примечание.
Ресурсы Контейнеров приложений Azure перенесены из пространства имен Microsoft.Web
в пространство имен Microsoft.App
. Дополнительные сведения см. в статье о миграции пространства имен из Microsoft.Web в Microsoft.App в марте 2022 г..
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Создание среды "Приложения контейнеров Azure"
После завершения настройки Azure CLI вы можете определить переменные среды, которые используются в этой статье.
Определите следующие переменные в оболочке Bash.
export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"
Создать группу ресурсов.
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION \
Создайте среду с автоматически созданной рабочей областью Log Analytics.
az containerapp env create \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location $LOCATION
Отображение домена по умолчанию среды приложения контейнера. Запишите этот домен для использования в последующих разделах.
az containerapp env show \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--query properties.defaultDomain
Подготовка приложения к развертыванию
При развертывании приложения в приложениях контейнеров Azure URL-адрес перенаправления изменяется на URL-адрес перенаправления развернутого экземпляра приложения в приложениях контейнеров Azure. Чтобы изменить эти параметры в файле application.yml , выполните следующие действия.
Перейдите к файлу src\main\resources\application.yml приложения и измените значение
post-logout-redirect-uri
доменного имени развернутого приложения, как показано в следующем примере. Обязательно замените<API_NAME>
<default-domain-of-container-app-environment>
и на ваши фактические значения. Например, с доменом по умолчанию для среды приложения контейнеров Azure из предыдущего шага иms-identity-api
для имени приложения вы будете использоватьhttps://ms-identity-api.<default-domain>
значениеpost-logout-redirect-uri
.post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
После сохранения этого файла используйте следующую команду, чтобы перестроить приложение:
mvn clean package
Внимание
Файл application.yml приложения в настоящее время содержит значение секрета клиента в параметре client-secret
. Не рекомендуется хранить это значение в этом файле. Вы также можете рисковать, если зафиксировать файл в репозитории Git. Рекомендуемый подход см. в статье "Управление секретами в приложениях контейнеров Azure".
Обновление регистрации приложения идентификатора Microsoft Entra
Так как URI перенаправления изменяется в развернутом приложении в приложениях контейнеров Azure, необходимо также изменить URI перенаправления в регистрации приложения Идентификатора Microsoft Entra. Чтобы внести это изменение, выполните следующие действия:
Перейдите на страницу Регистрация приложений Платформы удостоверений Майкрософт для разработчиков.
Используйте поле поиска для поиска регистрации приложения, например
java-servlet-webapp-authentication
.Откройте регистрацию приложения, выбрав его имя.
Выберите Проверка подлинности в меню.
В разделе URI веб-перенаправления - выберите "Добавить URI".
Заполните универсальный код ресурса (URI) приложения, добавляя
/login/oauth2/code/
напримерhttps://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/
.Выберите Сохранить.
Развертывание приложения
Разверните пакет JAR в приложениях контейнеров Azure.
Примечание.
При необходимости можно указать версию JDK в переменных среды сборки Java. Дополнительные сведения см. в статье "Создание переменных среды для Java" в приложениях контейнеров Azure.
Теперь вы можете развернуть WAR-файл с помощью az containerapp up
команды CLI.
az containerapp up \
--name $API_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--environment $ENVIRONMENT \
--artifact <JAR_FILE_PATH_AND_NAME> \
--ingress external \
--target-port 8080 \
--query properties.configuration.ingress.fqdn
Примечание.
Версия JDK по умолчанию — 17. Если необходимо изменить версию JDK для совместимости с приложением, можно использовать --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION>
аргумент для настройки номера версии.
Дополнительные переменные среды сборки см. в статье "Создание переменных среды для Java" в приложениях контейнеров Azure.
Проверка приложения
В этом примере containerapp up
команда включает --query properties.configuration.ingress.fqdn
аргумент, который возвращает полное доменное имя (FQDN), также известное как URL-адрес приложения. Выполните следующие действия, чтобы проверить журналы приложения, чтобы изучить любую проблему развертывания:
Перейдите по URL-адресу выходного приложения на странице "Выходные данные" раздела "Развертывание".
На панели навигации на странице "Обзор экземпляра приложений контейнеров Azure" выберите журналы, чтобы проверить журналы приложения.
Анализ примера
Чтобы изучить пример, выполните следующие действия.
- Обратите внимание, что состояние входа или выхода отображается в центре экрана.
- Нажмите кнопку с учетом контекста в углу. Эта кнопка считывает вход при первом запуске приложения. Кроме того, выберите ссылку на сведения о маркере. Так как эта страница защищена и требует проверки подлинности, вы автоматически перенаправляетесь на страницу входа.
- На следующей странице следуйте инструкциям и войдите с учетной записью выбранного поставщика удостоверений. Вы также можете зарегистрироваться или войти в локальную учетную запись клиента B2C с помощью адреса электронной почты.
- После успешного завершения потока входа необходимо перенаправить на домашнюю страницу, которая показывает состояние входа или страницу сведений о маркере, в зависимости от того, какая кнопка активировала поток входа.
- Обратите внимание, что кнопка с учетом контекста теперь говорит выход и отображает имя пользователя.
- Если вы находитесь на домашней странице, выберите "Сведения о маркере идентификатора", чтобы просмотреть некоторые декодированные утверждения маркера идентификатора.
- Измените профиль. Выберите профиль редактирования, чтобы изменить сведения, такие как отображаемое имя, место проживания и профессия.
- Нажмите кнопку в углу, чтобы выйти из нее. Страница состояния отражает новое состояние.
Примечания о коде
В этом примере показано, как использовать клиентную библиотеку Azure AD B2C Spring Boot Starter для Java для входа пользователей в клиент Azure AD B2C. В этом примере также используются начальные серверы клиента Spring Oauth2 и Spring Web. В примере используются утверждения из маркера идентификатора, полученного из Azure AD B2C, для отображения сведений о входе пользователя.
Содержимое
В следующей таблице показано содержимое папки примера проекта:
Файл или папка | Description |
---|---|
pom.xml | Зависимости приложений. |
src/main/resources/templates/ | Шаблоны Thymeleaf для пользовательского интерфейса. |
src/main/resources/application.yml | Конфигурация начальной библиотеки приложения и Microsoft Entra Boot Starter. |
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ | Этот каталог содержит основные классы входа приложения, контроллера и конфигурации. |
.../MsIdentitySpringBootWebappApplication.java | Основной класс. |
.../SampleController.java | Контроллер с сопоставлениями конечных точек. |
.../SecurityConfig.java | Конфигурация безопасности— например, маршруты, для которых требуется проверка подлинности. |
.../Utilities.java | Класс служебной программы— например, утверждения маркера идентификатора фильтра. |
CHANGELOG.md | Список изменений в примере. |
CONTRIBUTING.md | Рекомендации по участию в образце. |
ЛИЦЕНЗИЯ | Лицензия для примера. |
Утверждения маркера идентификатора
Чтобы извлечь сведения о маркере, приложение использует объект Spring Security AuthenticationPrincipal
и OidcUser
объект в сопоставлении запросов, как показано в следующем примере, как показано в следующем примере. Полные сведения об использовании утверждений маркера идентификатора см. в примере контроллера .
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
Map<String, Object> claims = principal.getIdToken().getClaims();
}
Ссылки на вход и выход
Для входа приложение отправляет запрос на конечную точку входа Azure AD B2C, автоматически настроенную клиентской библиотекой Azure AD B2C Spring Boot Starter для Java, как показано в следующем примере:
<a class="btn btn-success" href="/oauth2/authorization/{your-sign-up-sign-in-user-flow}">Sign In</a>
Для выхода приложение выполняет запрос POST к logout
конечной точке, как показано в следующем примере:
<form action="#" th:action="@{/logout}" method="post">
<input class="btn btn-warning" type="submit" value="Sign Out" />
</form>
Элементы пользовательского интерфейса, зависящие от проверки подлинности
Приложение имеет простую логику на страницах шаблона пользовательского интерфейса для определения содержимого, отображаемого на основе проверки подлинности пользователя, как показано в следующем примере с помощью тегов Spring Security Thymeleaf:
<div sec:authorize="isAuthenticated()">
this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
this content only shows to not-authenticated users
</div>
Защита маршрутов с помощью WebSecurityConfigurerAdapter
По умолчанию приложение защищает страницу сведений о маркере идентификатора, чтобы доступ к нему могли получить только пользователи, вошедшего в систему. Приложение настраивает эти маршруты из свойства из app.protect.authenticated
файла application.yml . Чтобы настроить конкретные требования приложения, вы можете расширить WebSecurityConfigurerAdapter
один из классов. Пример см. в классе SecurityConfig этого приложения, показанном в следующем коде:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${app.protect.authenticated}")
private String[] protectedRoutes;
private final AADB2COidcLoginConfigurer configurer;
public SecurityConfig(AADB2COidcLoginConfigurer configurer) {
this.configurer = configurer;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.authorizeRequests()
.antMatchers(protectedRoutes).authenticated() // limit these pages to authenticated users (default: /token_details)
.antMatchers("/**").permitAll() // allow all other routes.
.and()
.apply(configurer)
;
// @formatter:off
}
}
Дополнительные сведения
- платформа удостоверений Майкрософт (идентификатор Microsoft Entra для разработчиков)
- Общие сведения о библиотеке проверки подлинности Майкрософт (MSAL)
- Краткое описание: регистрация приложения на платформе Microsoft Identity
- Краткое руководство. Настройка клиентского приложения для доступа к веб-API
- Общие сведения о согласии приложений с идентификатором Microsoft Entra ID
- Understand user and admin consent (Получение согласия пользователя и администратора)
- Сведения об объектах приложения и субъекта-службы в Microsoft Entra ID
- Национальные облака
- Примеры кода MSAL
- Клиентская библиотека Microsoft Entra ID Spring Boot Starter для Java
- Клиентская библиотека Azure Active Directory B2C Spring Boot Starter для Java
- Библиотека проверки подлинности Майкрософт для Java (MSAL4J)
- Вики-сайт MSAL4J
- Маркеры идентификации
- Маркеры доступа на платформе удостоверений Майкрософт
Дополнительные сведения о работе протоколов OAuth 2.0 в этом сценарии и других сценариях см. в сценариях проверки подлинности для идентификатора Microsoft Entra.