Включение входа для приложений 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.
Необходимые компоненты
- JDK версии 8 или более поздней
- Maven 3
- Клиент Azure AD B2C. Дополнительные сведения см. в руководстве по созданию клиента Azure Active Directory 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, в котором вы хотите создать приложения
Чтобы выбрать клиент, выполните следующие действия.
Войдите на портал 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.
Выберите "Регистрация приложений" на панели навигации и выберите "Создать регистрацию".
На появившемся экране "Регистрация приложения" введите следующие сведения о регистрации приложения:
- В разделе "Имя" введите понятное имя приложения для отображения пользователям приложения, например
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
- В разделе "Имя" введите понятное имя приложения для отображения пользователям приложения, например
Выберите Зарегистрировать, чтобы создать приложение.
На странице регистрации приложения найдите и скопируйте значение идентификатора приложения (клиента), которое будет использоваться позже. Это значение используется в файле конфигурации или файлах приложения.
Выберите Сохранить, чтобы сохранить изменения.
На странице регистрации приложения выберите сертификаты и секреты на панели навигации, чтобы открыть страницу, где можно создать секреты и отправить сертификаты.
В разделе Секреты клиента выберите Создать секрет клиента.
Введите описание, например секрет приложения.
Выберите одну из доступных продолжительности: в течение 1 года, за 2 года или никогда не истекает.
Выберите Добавить. Отображается созданное значение.
Скопируйте и сохраните созданное значение для использования в последующих шагах. Это значение требуется для файлов конфигурации кода. Это значение не отображается снова, и его нельзя получить другими средствами. Таким образом, не забудьте сохранить его из портал Azure перед переходом на любой другой экран или область.
Настройка приложения (ms-identity-b2c-java-servlet-webapp-authentication) для использования регистрации приложения
Чтобы настроить приложение, выполните следующие действия.
Примечание.
В следующих шагах ClientID
выполняется то же самое, что Application ID
и AppId
.
Откройте проект в интегрированной среде разработки.
Откройте файл ./src/main/resources/authentication.properties.
aad.clientId
Найдите свойство и замените существующее значение идентификатором приложения илиclientId
ms-identity-b2c-java-servlet-webapp-authentication
приложением из портал Azure.aad.secret
Найдите свойство и замените существующее значение значением, сохраненным во время созданияms-identity-b2c-java-servlet-webapp-authentication
приложения из портал Azure.Найдите свойство и замените существующий
aad.scopes
идентификатор клиента приложения значением, помещеннымaad.clientId
на шаге 1 этого раздела.aad.authority
Найдите свойство и замените первый экземплярfabrikamb2c
именем клиента Azure AD B2C, в котором вы создалиms-identity-b2c-java-servlet-webapp-authentication
приложение в портал Azure.aad.authority
Найдите свойство и замените второй экземплярfabrikamb2c
именем клиента Azure AD B2C, в котором вы создалиms-identity-b2c-java-servlet-webapp-authentication
приложение в портал Azure.aad.signInPolicy
Найдите свойство и замените его именем политики регистрации и входа в поток пользователя, созданной в клиенте Azure AD B2C, в котором вы создалиms-identity-b2c-java-servlet-webapp-authentication
приложение в портал Azure.aad.passwordResetPolicy
Найдите свойство и замените его именем политики сброса пароля, созданной в клиенте Azure AD B2C, в котором вы создалиms-identity-b2c-java-servlet-webapp-authentication
приложение в портал Azure.aad.editProfilePolicy
Найдите свойство и замените его именем политики редактирования пользовательского потока профиля, созданной в клиенте Azure AD B2C, в котором вы создалиms-identity-b2c-java-servlet-webapp-authentication
приложение в портал Azure.
Сборка примера
Чтобы создать пример с помощью Maven, перейдите в каталог, содержащий файл pom.xml для примера, а затем выполните следующую команду:
mvn clean package
Эта команда создает WAR-файл , который можно запустить на различных серверах приложений.
Запуск примера
В следующих разделах показано, как развернуть пример в службе приложение Azure.
Необходимые компоненты
Подключаемый модуль Maven для приложений службы приложение Azure
Если Maven не является вашим предпочтительным средством разработки, ознакомьтесь со следующими руководствами, которые используют другие инструменты:
Настройка подключаемого модуля Maven
Процесс развертывания для службы приложение Azure использует учетные данные Azure из Azure CLI автоматически. Если Azure CLI не установлен локально, подключаемый модуль Maven проходит проверку подлинности с помощью OAuth или входа устройства. Дополнительные сведения см. в статье о проверке подлинности с помощью подключаемых модулей Maven.
Чтобы настроить подключаемый модуль, выполните следующие действия.
Выполните команду Maven, показанную рядом с настройкой развертывания. Эта команда помогает настроить Служба приложений операционную систему, версию Java и версию Tomcat.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config
Для создания конфигурации запуска нажмите клавишу Y, а затем нажмите клавишу ВВОД.
Для определения значения ос нажмите клавишу 2 для Linux, а затем нажмите клавишу ВВОД.
Для определения значения javaVersion нажмите клавишу 2 для Java 11, а затем нажмите клавишу ВВОД.
Для определения значения для webContainer нажмите клавишу 1 для JBosseap7, а затем нажмите клавишу ВВОД.
Чтобы определить значение для ценообразования, нажмите клавишу ВВОД, чтобы выбрать уровень P1v3 по умолчанию.
Для подтверждения нажмите клавишу 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-адрес перенаправления развернутого экземпляра приложения. Чтобы изменить эти параметры в файле свойств, выполните следующие действия.
Перейдите к файлу 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
После сохранения этого файла используйте следующую команду, чтобы перестроить приложение:
mvn clean package
Внимание
В этом же файле authentication.properties у вас есть параметр aad.secret
. Это не рекомендуется развертывать это значение в Служба приложений. Не рекомендуется оставить это значение в коде и потенциально отправить его в репозиторий Git. Чтобы удалить это значение секрета из кода, см. более подробные инструкции в разделе "Развертывание в Служба приложений. Удаление секрета". В этом руководстве добавлены дополнительные шаги для отправки значения секрета в Key Vault и использования ссылок на Key Vault.
Обновление регистрации приложения идентификатора Microsoft Entra
Так как URI перенаправления изменяется в развернутом приложении в службе приложение Azure, необходимо также изменить URI перенаправления в регистрации приложения Идентификатора Microsoft Entra. Чтобы внести это изменение, выполните следующие действия:
Перейдите на страницу Регистрация приложений Платформы удостоверений Майкрософт для разработчиков.
Используйте поле поиска для поиска регистрации приложения, например
java-servlet-webapp-authentication
.Откройте регистрацию приложения, выбрав его имя.
Выберите Проверка подлинности в меню.
В разделе URI веб-перенаправления - выберите "Добавить URI".
Заполните универсальный код ресурса (URI) приложения, добавляя
/auth/redirect
напримерhttps://<your-app-name>.azurewebsites.net/auth/redirect
.Выберите Сохранить.
Развертывание приложения
Теперь вы готовы развернуть приложение в службе приложение Azure. Используйте следующую команду, чтобы убедиться, что вы вошли в среду Azure для выполнения развертывания:
az login
Все конфигурации, готовые к использованию в файле pom.xml , теперь можно использовать следующую команду для развертывания приложения Java в Azure:
mvn package azure-webapp:deploy
После завершения развертывания приложение будет готово http://<your-app-name>.azurewebsites.net/
. Откройте URL-адрес в локальном веб-браузере, где должна появиться начальная страница msal4j-servlet-auth
приложения.
Анализ примера
Чтобы изучить пример, выполните следующие действия.
- Обратите внимание, что состояние входа или выхода отображается в центре экрана.
- Нажмите кнопку с учетом контекста в углу. Эта кнопка считывает вход при первом запуске приложения.
- На следующей странице следуйте инструкциям и войдите с учетной записью выбранного поставщика удостоверений.
- Обратите внимание, что кнопка с учетом контекста теперь говорит выход и отображает имя пользователя.
- Выберите сведения о маркере идентификатора, чтобы просмотреть некоторые декодированные утверждения маркера идентификатора.
- Вы также можете изменить свой профиль. Выберите ссылку, чтобы изменить сведения, такие как отображаемое имя, место проживания и профессия.
- Нажмите кнопку в углу, чтобы выйти из нее.
- После выхода перейдите по следующему 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 .
Пошаговое руководство
Ниже приведены пошаговые инструкции по функциональным возможностям приложения:
Первым шагом процесса входа является отправка запроса
/authorize
в конечную точку клиента Azure Active Directory B2C. Экземпляр MSAL4JConfidentialClientApplication
используется для создания 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, тем самым обеспечивая отсутствие атаки на воспроизведение маркеров.
Пользователь предоставляет запрос на вход в Azure Active Directory B2C. Если попытка входа выполнена успешно, браузер пользователя перенаправляется в конечную точку перенаправления приложения. Допустимый запрос к этой конечной точке содержит код авторизации.
Затем
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
: области, используемые на предыдущем шаге, должны быть переданы снова.
В
acquireToken
случае успешного выполнения утверждения маркера извлекаются, а утверждение nonce проверяется в соответствии с нецем, хранящимся в сеансе, как показано в следующем примере:parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache); validateNonce(msalAuth) processSuccessfulAuthentication(msalAuth);
Если неисключение успешно проверено, состояние проверки подлинности помещается в сеанс на стороне сервера, используя методы, предоставляемые
MsalAuthSession
классом, как показано в следующем примере:msalAuth.setAuthenticated(true); msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
Дополнительные сведения
- Что такое Azure Active Directory B2C?
- Типы приложений, используемые в Azure Active Directory B2C
- Советы и рекомендации по использованию Azure Active Directory B2C
- Сеанс Azure AD B2C
- Библиотека проверки подлинности Майкрософт (MSAL) для Java
Дополнительные сведения о работе протоколов OAuth 2.0 в этом сценарии и других сценариях см. в сценариях проверки подлинности для идентификатора Microsoft Entra.