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


Добавление входа с помощью Azure Active Directory B2C в веб-приложение Spring

В этой статье рассказывается, как создать приложение Java с функцией входа, используя Spring Initializr с использованием Spring Boot Starter для Microsoft Entra ID.

В этом руководстве описано, как:

  • Создание приложения Java с помощью Spring Initializr
  • Настройка Azure Active Directory B2C
  • Защита приложения с помощью классов Spring Boot и заметок
  • Создание и тестирование приложения Java

Microsoft Entra ID — это облачное решение для идентификации корпоративного уровня от Microsoft. Azure Active Directory B2C дополняет набор функций идентификатора Microsoft Entra ID, позволяя управлять доступом клиентов, потребителей и граждан к приложениям "бизнес-потребитель" (B2C).

Необходимые условия

Важный

Для выполнения действий, описанных в этой статье, требуется spring Boot версии 2.5 или более поздней.

Создание приложения с помощью Spring Initializr

  1. Перейдите к https://start.spring.io/.

  2. Заполните значения в соответствии с этим руководством. Метки и макет могут отличаться от изображения, показанного здесь.

    • В разделе Projectвыберите Maven Project.
    • В разделеязыка выберите Java.
    • В разделе Spring Bootвыберите 2.7.11.
    • В разделе GroupArtifact и Name введите то же значение, используя короткую описательную строку. Пользовательский интерфейс может автоматически заполнить некоторые из этих полей при вводе.
    • В панели Зависимостей выберите Добавить Зависимости. Используйте пользовательский интерфейс для добавления зависимостей на Spring Web и Spring Security.

    Заметка

    Spring Security 5.5.1, 5.4.7, 5.3.10 и 5.2.11 были выпущены для решения следующих отчетов CVE CVE-2021-22119: атака типа "отказ в обслуживании" с использованием spring-security-oauth2-client. Если вы используете старую версию, обновите ее.

  3. Выберите Создать проект, а затем загрузите проект в папку на вашем локальном компьютере. Переместите скачанный файл в каталог с именем проекта и распакуйте файл. Макет файла должен выглядеть примерно так, как показано ниже, при этом значение, введенное для Группа, будет на месте yourProject.

    .
    ├── HELP.md
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    └── src
        ├── main
        │   ├── java
        │   │   └── yourProject
        │   │       └── yourProject
        │   │           └── YourProjectApplication.java
        │   └── resources
        │       ├── application.properties
        │       ├── static
        │       └── templates
        └── test
            └── java
                └── yourProject
                    └── yourProject
                        └── YourProjectApplicationTests.java
    

Создание и инициализация экземпляра Microsoft Entra

Создание экземпляра Active Directory

  1. Войдите в https://portal.azure.com.

  2. Выберите Создать ресурс. Найдите Azure Active Directory B2C.

    Создать новый экземпляр Azure Active Directory B2C с помощью портала Azure.

  3. Выберите Создать.

    запись в Azure Marketplace для Azure Active Directory B2C.

  4. Выберите Создать новый клиент Azure AD B2C.

    опция портала Azure для создания нового арендатора Azure AD B2C.

  5. Для имени организации и начального доменного имениукажите соответствующие значения, а затем выберите Создать.

    Экран создания клиента Azure AD B2C.

  6. После завершения создания Active Directory выберите свою учетную запись в правом верхнем углу, выберите Переключить каталог, а затем выберите созданный каталог. Вы будете перенаправлены на домашнюю страницу нового клиента. Затем найдите b2c и выберите Azure AD B2C.

    найдите службу Azure AD B2C.

Добавьте регистрацию для вашего приложения Spring Boot.

  1. В области Управление выберите регистрации приложений, а затем выберите новая регистрация.

    снимок экрана портала Azure, на котором показан экран регистрации приложений Azure AD B2C.

  2. В поле имя введите имя приложения, а затем выберите Зарегистрировать.

    Azure AD B2C форма регистрации приложения.

  3. Вернитесь на панель управления , выберите "Регистрация приложений", а затем выберите ранее созданное приложение.

    экран регистрации приложений с выбранным отображаемым именем.

  4. Выберите Аутентификация, затем Добавить платформу, затем Веб. Задайте для URI перенаправления , а затем выберите Настроить.

    Параметры, выбранные для проверки подлинности, добавьте платформу, веб-сайт.

    Настройка веб-экрана с выбранным полем URI перенаправления.

Добавьте секреты для вашего приложения

Выберите секреты & секретов, а затем новые секреты клиента. Введите секретное описание, затем выберите Добавить. После создания секрета щелкните значок копирования рядом со значением секрета, чтобы скопировать значение для использования далее в этой статье.

добавить экран секрета клиента.

экран

Заметка

Если вы покинете раздел сертификаты & секреты и вернётесь, вы не сможете увидеть значение секретов. В этом случае необходимо создать другой секрет и скопировать его для дальнейшего использования. Иногда созданное значение секрета может содержать символы, которые являются проблемными для включения в файл application.yml, например обратный слэш или обратный апостроф. В этом случае удалите этот секрет и создайте другой.

Добавить поток пользователя

  1. Перейдите на главную страницу клиента. В разделе политик левой области выберите потоки пользователей, а затем выберите Новый поток пользователя.

  2. Теперь вы покинете это руководство, выполните другое руководство и вернетесь к этому руководству, когда закончите работу. Пожалуйста, учитывайте следующие моменты, когда переходите на другое руководство.

    • Начните с шага, в котором необходимо выбрать поток создания нового пользователя .
    • Если в этом руководстве упоминается , используйте вместо этого значение, которое вы ввели для Группы .
    • При выборе утверждений для возврата из потоков убедитесь, что выбран отображаемое имя. Без этого утверждения приложение, созданное в этом руководстве, не будет работать.
    • Когда вам будет предложено запустить потоки пользователей, url-адрес перенаправления, указанный ранее, еще не активен. Вы по-прежнему можете запускать потоки, но перенаправление не завершится успешно. Это ожидается.
    • Когда вы достигнете "Дальнейшие шаги", вернитесь к этому руководству.

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

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

Настройка и компиляция приложения

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

  1. В командной строке перейдите в каталог, где вы распаковали файл .zip, который скачали со Spring Initializr.

  2. Перейдите к родительской папке проекта и откройте файл проекта pom.xml Maven в текстовом редакторе.

  3. Добавьте зависимости для безопасности Spring OAuth2 в pom.xml:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
        <version>See Below</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <version>See Below</version>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        <version>See Below</version>
    </dependency>
    

    Для spring-cloud-azure-starter-active-directory-b2cиспользуйте последнюю доступную версию. Вы, возможно, сможете использовать mvnrepository.com для поиска этого.

    Для spring-boot-starter-thymeleafиспользуйте версию, соответствующую выбранной выше версии Spring Boot, например 2.3.4.RELEASE.

    Для thymeleaf-extras-springsecurity5используйте последнюю версию. Возможно, вы сможете использовать mvnrepository.com для поиска этого. По состоянию на этот момент последняя версия 3.0.4.RELEASE.

  4. Сохраните и закройте файл pom.xml.

    • Убедитесь, что зависимости верны, выполнив mvn -DskipTests clean install. Если вы не видите BUILD SUCCESS, попробуйте диагностировать и устранить проблему, прежде чем продолжить.
  5. Перейдите в папку src/main/resources в проекте и создайте файл application.yml в текстовом редакторе.

  6. Укажите параметры для регистрации приложения с помощью значений, созданных ранее; Например:

    spring:
      cloud:
        azure:
          active-directory:
            b2c:
              enabled: true
              base-uri: https://<your-tenant-initial-domain-name>.b2clogin.com/<your-tenant-initial-domain-name>.onmicrosoft.com/
              credential:
                client-id: <your-application-ID>
                client-secret: '<secret-value>'
              login-flow: sign-up-or-sign-in
              logout-success-url: <your-logout-success-URL>
              user-flows:
                sign-up-or-sign-in: <your-sign-up-or-sign-in-user-flow-name> 
                profile-edit: <your-profile-edit-user-flow-name> 
                password-reset: <your-password-reset-user-flow-name> 
              user-name-attribute-name: <your-user-name-attribute-name> 
    

    Обратите внимание, что значение client-secret заключено в одинарные кавычки. Это необходимо, так как значение <secret-value> почти наверняка будет содержать некоторые символы, требующие того, чтобы находиться внутри отдельных кавычки при наличии в YAML.

    Заметка

    На момент написания этой статьи полный список значений Active Directory B2C Spring Integration, доступных для использования в application.yml, приведен ниже.

    spring:
      cloud:
        azure:
          active-directory:
            b2c:
              enabled: true
              base-uri:
              credential:
                client-id:
                client-secret:
              login-flow:  
              logout-success-url:
              user-flows:
                sign-up-or-sign-in:
                profile-edit: # optional
                password-reset: # optional
              user-name-attribute-name:
    

    Файл application.yml доступен в примере spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application на GitHub.

  7. Сохраните и закройте файл application.yml.

  8. Создайте папку с именем "контроллер" в src/main/java/<вашGroupId>/<вашGroupId>, заменив <yourGroupId> значением, введенным для Группы .

  9. Создайте файл Java с именем WebController.java в папке контроллера и откройте его в текстовом редакторе.

  10. Введите следующий код, измените yourGroupId соответствующим образом, а затем сохраните и закройте файл:

    package yourGroupId.yourGroupId.controller;
    
    import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
    import org.springframework.security.oauth2.core.user.OAuth2User;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class WebController {
    
        private void initializeModel(Model model, OAuth2AuthenticationToken token) {
            if (token != null) {
                final OAuth2User user = token.getPrincipal();
    
                model.addAttribute("grant_type", user.getAuthorities());
                model.addAllAttributes(user.getAttributes());
            }
        }
    
        @GetMapping(value = "/")
        public String index(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "home";
        }
    
        @GetMapping(value = "/greeting")
        public String greeting(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "greeting";
        }
    
        @GetMapping(value = "/home")
        public String home(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "home";
        }
    }
    

    Так как каждый метод в контроллере вызывает initializeModel(), и этот метод вызывает model.addAllAttributes(user.getAttributes());, любая HTML-страница в src/main/resources/templates может получить доступ к любому из этих атрибутов, например ${name}, ${grant_type}или ${auth_time}. Значения, возвращаемые из user.getAttributes(), фактически являются утверждениями id_token для проверки подлинности. Полный список доступных утверждений приведён в идентификационные токены платформы удостоверения Майкрософт.

  11. Создайте папку с именем security в src/main/java/<yourGroupId>/<yourGroupId>, заменив yourGroupId значением, которое вы ввели для Group.

  12. Создайте файл Java с именем WebSecurityConfiguration.java в папке безопасности и откройте его в текстовом редакторе.

  13. Введите следующий код, измените yourGroupId соответствующим образом, а затем сохраните и закройте файл:

    package yourGroupId.yourGroupId.security;
    
    import com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @EnableWebSecurity
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        private final AadB2cOidcLoginConfigurer configurer;
    
        public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
            this.configurer = configurer;
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .apply(configurer)
            ;
        }
    }
    
  14. Скопируйте файл home.html из примера spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application в папку src/main/resources/templates, затем замените ${your-profile-edit-user-flow} и ${your-password-reset-user-flow} на имена потоков пользователей, которые вы создали ранее.

Создание и тестирование приложения

  1. Откройте командную строку и перейдите в папку, в которой находится файл pom.xml приложения.

  2. Создайте приложение Spring Boot с помощью Maven и запустите его; Например:

    Заметка

    Очень важно, чтобы время, соответствующее системным часам, под которыми выполняется локальное приложение Spring Boot, было точным. При использовании OAuth 2.0 допустимо лишь незначительное рассогласование времени. Даже три минуты неточности могут привести к сбою знака с ошибкой, аналогичной [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. На момент написания, time.gov имеет индикатор того, насколько отличаются ваши часы от фактического времени. Приложение успешно запущено с отклонением от 0,019 секунд.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. После создания и запуска приложения Maven откройте http://localhost:8080/ в веб-браузере; Вы должны быть перенаправлены на страницу входа.

    страница входа в веб-приложение .

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

  5. После успешного входа в систему вы увидите пример home page из браузера.

    успешный вход в веб-приложение.

Устранение неполадок

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

Отсутствует имя атрибута в атрибутах

При выполнении примера может возникнуть исключение с сообщением Missing attribute 'name' in attributes. Вывод лога для этого исключения будет выглядеть примерно следующим образом:

java.lang.IllegalArgumentException: Missing attribute 'name' in attributes
at org.springframework.security.oauth2.core.user.DefaultOAuth2User.<init>(DefaultOAuth2User.java:67) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser.<init>(DefaultOidcUser.java:89) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:144) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:63) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]

Если вы получите эту ошибку, дважды проверьте созданный вами поток пользователей в руководстве : Создание потоков пользователей в Azure Active Directory B2C. При создании рабочего процесса для пользователя для атрибутов пользователя и утвержденийобязательно выберите атрибуты и утверждения для отображаемого имени. Кроме того, не забудьте правильно настроить user-name-attribute-name в файле application.yml.

Вход с помощью циклов в конечную точку B2C

Эта проблема, скорее всего, связана с загрязненными файлами cookie для localhost. Очистите файлы cookie для localhost и повторите попытку.

Сводка

В этом руководстве вы создали веб-приложение Java с помощью начального средства Azure Active Directory B2C, настроили новый клиент Azure AD B2C и зарегистрировали в нем новое приложение, а затем настроили приложение, чтобы использовать заметки и классы Spring для защиты веб-приложения.

Очистка ресурсов

При отсутствии необходимости используйте портал Azure для удаления ресурсов, созданных в этой статье, чтобы избежать непредвиденных расходов.

Дальнейшие действия

Чтобы узнать больше о Spring и Azure, перейдите в центр документации Spring в Azure.