Udostępnij za pośrednictwem


Dodawanie logowania przy użyciu usługi Azure Active Directory B2C do aplikacji internetowej Spring

W tym artykule pokazano, jak utworzyć aplikację Java z możliwością logowania przy użyciu narzędzia Spring Initializr z szablonem startowym Spring Boot dla usługi Microsoft Entra ID.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Tworzenie aplikacji Java przy użyciu narzędzia Spring Initializr
  • Konfigurowanie usługi Azure Active Directory B2C
  • Zabezpieczanie aplikacji za pomocą klas i adnotacji Spring Boot
  • Tworzenie i testowanie aplikacji Java

Microsoft Entra ID to rozwiązanie do obsługi tożsamości przedsiębiorstwa w skali chmury firmy Microsoft. Usługa Azure Active Directory B2C uzupełnia zestaw funkcji microsoft Entra ID, umożliwiając zarządzanie dostępem klientów, konsumentów i obywateli do aplikacji typu "klient-klient" (B2C).

Wymagania wstępne

Ważne

Do wykonania kroków opisanych w tym artykule jest wymagany program Spring Boot w wersji 2.5 lub nowszej.

Tworzenie aplikacji przy użyciu narzędzia Spring Initializr

  1. Przejdź do https://start.spring.io/.

  2. Wypełnij wartości zgodnie z tym wskazówkami. Etykiety i układ mogą się różnić od przedstawionego tutaj obrazu.

    • W obszarze Projekt wybierz pozycję Projekt Maven.
    • W obszarze Język wybierz pozycję Java.
    • W obszarze Spring Boot wybierz pozycję 2.7.11.
    • W obszarze Grupa artefakti nazwa wprowadź tę samą wartość, używając krótkiego ciągu opisowego. Interfejs użytkownika może automatycznie wypełniać niektóre z tych pól podczas wpisywania.
    • W okienku Zależności wybierz pozycję Dodaj zależności. Użyj interfejsu użytkownika, aby dodać zależności od aplikacji Spring Web i Spring Security.

    Uwaga

    Usługa Spring Security 5.5.1, 5.4.7, 5.3.10 i 5.2.11 zostały wydane w celu rozwiązania następującego raportu CVE CVE-2021-22119: Atak typu "odmowa usługi" z klientem spring-security-oauth2-client. Jeśli używasz starszej wersji, uaktualnij ją.

  3. Wybierz pozycję Generuj projekt, a następnie pobierz projekt do ścieżki na komputerze lokalnym. Przenieś pobrany plik do katalogu o nazwie po projekcie i rozpakuj plik. Układ pliku powinien wyglądać podobnie do poniższego, z wartością wprowadzoną dla pozycji Grupa zamiast 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
    

Tworzenie i inicjowanie wystąpienia usługi Microsoft Entra

Tworzenie wystąpienia usługi Active Directory

  1. Zaloguj się w witrynie https://portal.azure.com.

  2. Wybierz pozycję Utwórz zasób. Wyszukaj usługę Azure Active Directory B2C.

    Utwórz nowe wystąpienie usługi Azure Active Directory B2C przy użyciu witryny Azure Portal.

  3. Wybierz pozycję Utwórz.

    Wpis witryny Azure Marketplace dla usługi Azure Active Directory B2C.

  4. Wybierz Stwórz nową dzierżawę B2C Azure AD.

    Opcja witryny Azure Portal umożliwiająca utworzenie nowej dzierżawy usługi Azure AD B2C.

  5. W polu Nazwa organizacji i Początkowa nazwa domeny podaj odpowiednie wartości, a następnie wybierz pozycję Utwórz.

    Ekran Tworzenie dzierżawy w usłudze Azure AD B2C.

  6. Po zakończeniu tworzenia usługi Active Directory wybierz swoje konto w prawym górnym rogu, wybierz pozycję Przełącz katalog, a następnie wybierz utworzony katalog. Nastąpi przekierowanie do nowej strony głównej dzierżawy. Następnie wyszukaj b2c i wybierz pozycję Azure AD B2C.

    Znajdź usługę Azure AD B2C.

Dodawanie rejestracji aplikacji dla aplikacji Spring Boot

  1. W okienku Zarządzanie wybierz pozycję Rejestracje aplikacji, a następnie wybierz pozycję Nowa rejestracja.

    Zrzut ekranu witryny Azure Portal przedstawiający ekran Rejestracje aplikacji usługi Azure AD B2C.

  2. W polu Nazwa wprowadź nazwę aplikacji, a następnie wybierz pozycję Zarejestruj.

    Usługa Azure AD B2C rejestruje formularz aplikacji.

  3. Po powrocie do okienka Zarządzanie wybierz pozycję Rejestracje aplikacji, a następnie wybierz utworzoną nazwę aplikacji.

    Rejestracje aplikacji ekran z wybraną nazwą wyświetlaną.

  4. Wybierz pozycję Uwierzytelnianie, a następnie pozycję Dodaj platformę, a następnie pozycję Sieć Web. Ustaw identyfikatory URI przekierowania na http://localhost:8080/login/oauth2/code/, a następnie wybierz pozycję Konfiguruj.

    Opcje wybrane do uwierzytelniania, dodaj platformę, internet.

    Skonfiguruj ekran internetowy z wybranym polem Identyfikatory URI przekierowania.

Dodawanie wpisów tajnych aplikacji dla aplikacji

Wybierz pozycję Certyfikaty i wpisy tajne, a następnie Pozycję Nowe wpisy tajne klienta. Wprowadź opis wpisu tajnego, a następnie wybierz pozycję Dodaj. Po utworzeniu wpisu tajnego wybierz ikonę kopiowania obok wartości wpisu tajnego, aby skopiować wartość do użycia w dalszej części tego artykułu.

Dodaj ekran wpisu tajnego klienta.

Ekran Certyfikaty i wpisy tajne z wybranym przyciskiem kopiowania.

Uwaga

Jeśli opuścisz sekcję Certyfikaty i wpisy tajne i wrócisz, nie będzie można wyświetlić wartości wpisu tajnego. W takim przypadku należy utworzyć inny wpis tajny i skopiować go do użytku w przyszłości. Od czasu do czasu wygenerowana wartość wpisu tajnego może zawierać znaki, które są problematyczne do włączenia do pliku application.yml , takie jak ukośnik odwrotny lub odwrotny. W takim przypadku odrzuć ten wpis tajny i wygeneruj inny.

Dodawanie przepływu użytkownika

  1. Przejdź do strony głównej dzierżawy. W sekcji Zasady w okienku po lewej stronie wybierz pozycję Przepływy użytkownika, a następnie wybierz pozycję Nowy przepływ użytkownika.

  2. Teraz opuścisz ten samouczek, wykonasz kolejny samouczek i wrócisz do tego samouczka po zakończeniu pracy. Poniżej przedstawiono kilka kwestii, które należy wziąć pod uwagę podczas przechodzenia do innego samouczka.

    • Zacznij od kroku, który zażąda wybrania pozycji Nowy przepływ użytkownika.
    • Gdy ten samouczek odwołuje się do webapp1elementu , użyj wartości wprowadzonej dla grupy.
    • Po wybraniu oświadczeń, które mają być zwracane z przepływów, upewnij się, że wybrano pozycję Nazwa wyświetlana. Bez tego oświadczenia aplikacja tworzona w tym samouczku nie będzie działać.
    • Gdy zostanie wyświetlony monit o uruchomienie przepływów użytkownika, podany wcześniej adres URL przekierowania nie jest jeszcze aktywny. Nadal można uruchamiać przepływy, ale przekierowanie nie zostanie ukończone pomyślnie. Jest to oczekiwane.
    • Po osiągnięciu kroku "Następne kroki" wróć do tego samouczka.

    Wykonaj wszystkie kroki opisane w temacie Samouczek: tworzenie przepływów użytkownika w usłudze Azure Active Directory B2C w celu utworzenia przepływów użytkownika na potrzeby "rejestracji i logowania", "edytowania profilu" i "resetowania hasła".

    Usługa Azure AD B2C obsługuje konta lokalne, a także dostawców tożsamości społecznościowych. Aby zapoznać się z przykładem tworzenia dostawcy tożsamości Usługi GitHub, zobacz Konfigurowanie rejestracji i logowania przy użyciu konta usługi GitHub przy użyciu usługi Azure Active Directory B2C.

Konfigurowanie i kompilowanie aplikacji

Po utworzeniu wystąpienia usługi Azure AD B2C i niektórych przepływów użytkownika połączysz aplikację Spring z wystąpieniem usługi Azure AD B2C.

  1. Z wiersza polecenia przejdź do katalogu, w którym rozpakujesz plik .zip pobrany z narzędzia Spring Initializr.

  2. Przejdź do folderu nadrzędnego projektu i otwórz plik projektu pom.xml Maven w edytorze tekstów.

  3. Dodaj zależności dla zabezpieczeń spring OAuth2 do 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>
    

    W przypadku programu spring-cloud-azure-starter-active-directory-b2cużyj najnowszej dostępnej wersji. Możesz użyć mvnrepository.com do wyszukania tego.

    W przypadku elementu spring-boot-starter-thymeleafużyj wersji odpowiadającej wybranej powyżej wersji środowiska Spring Boot, na przykład 2.3.4.RELEASE.

    W przypadku thymeleaf-extras-springsecurity5programu użyj najnowszej dostępnej wersji. Możesz użyć mvnrepository.com do wyszukania tego. Zgodnie z tym zapisem najnowsza wersja to 3.0.4.RELEASE.

  4. Zapisz i zamknij plik pom.xml.

    • Sprawdź, czy zależności są poprawne, uruchamiając polecenie mvn -DskipTests clean install. Jeśli nie widzisz BUILD SUCCESSpolecenia , przed kontynuowaniem rozwiąż problem i rozwiąż go.
  5. Przejdź do folderu src/main/resources w projekcie i utwórz plik application.yml w edytorze tekstów.

  6. Określ ustawienia dotyczące rejestracji aplikacji przy użyciu utworzonych wcześniej wartości. Na przykład:

    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> 
    

    Zwróć uwagę, że client-secret wartość jest ujęta w apostrofy. Jest to konieczne, ponieważ wartość <secret-value> elementu prawie na pewno zawiera pewne znaki, które wymagają bycia wewnątrz pojedynczych cudzysłowów w przypadku obecności w języku YAML.

    Uwaga

    W tym zapisie pełna lista wartości integracji usługi Active Directory B2C Spring, które są dostępne do użycia w application.yml , jest następująca:

    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:
    

    Plik application.yml jest dostępny w przykładzie spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application w witrynie GitHub.

  7. Zapisz i zamknij plik application.yml.

  8. Utwórz folder o nazwie controller w pliku src/main/java/<yourGroupId/<yourGroupId>>, zastępując element <yourGroupId> wartością wprowadzoną dla wartości Group.

  9. Utwórz nowy plik Java o nazwie WebController.java w folderze controller i otwórz go w edytorze tekstów.

  10. Wprowadź następujący kod, zmieniając yourGroupId odpowiednio, a następnie zapisz i zamknij plik:

    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";
        }
    }
    

    Ponieważ każda metoda w kontrolerze wywołuje initializeModel()metodę i wywołuje model.addAllAttributes(user.getAttributes());metodę , każda strona HTML w pliku src/main/resources/templates jest w stanie uzyskać dostęp do dowolnego z tych atrybutów, takich jak ${name}, ${grant_type}lub ${auth_time}. Zwracane user.getAttributes() wartości są w rzeczywistości oświadczeniami id_token uwierzytelniania. Pełną listę dostępnych oświadczeń znajduje się na liście Platforma tożsamości Microsoft tokenów identyfikatorów.

  11. Utwórz folder o nazwie security in src/main/java/<yourGroupId/<yourGroupId>>, zastępując ciąg yourGroupId wartością wprowadzoną dla wartości Group.

  12. Utwórz nowy plik Java o nazwie WebSecurityConfiguration.java w folderze security i otwórz go w edytorze tekstów.

  13. Wprowadź następujący kod, zmieniając yourGroupId odpowiednio, a następnie zapisz i zamknij plik:

    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. Skopiuj plik home.html z przykładu spring-cloud-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application do pliku src/main/resources/templates, a następnie zastąp ${your-profile-edit-user-flow} wartości i ${your-password-reset-user-flow} nazwami utworzonych wcześniej przepływów użytkownika.

Tworzenie i testowanie aplikacji

  1. Otwórz wiersz polecenia i zmień katalog na folder, w którym znajduje się plik pom.xml.

  2. Skompiluj swoją aplikację Spring Boot przy użyciu narzędzia Maven i uruchom ją, na przykład:

    Uwaga

    Niezwykle ważne jest, aby czas zgodnie z zegarem systemowym, w którym działa lokalna aplikacja spring boot, była dokładna. Istnieje bardzo mała tolerancja niesymetryczności zegara w przypadku korzystania z protokołu OAuth 2.0. Nawet trzy minuty niedokładności mogą spowodować niepowodzenie znaku z błędem podobnym do [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. Od tego zapisu time.gov ma wskaźnik, jak daleko od zegara jest od rzeczywistego czasu. Aplikacja została pomyślnie uruchomiona z niesymetrycznością +0,019 sekund.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. Po skompilowaniu i uruchomieniu aplikacji przez narzędzie Maven otwórz adres http://localhost:8080/ w przeglądarce internetowej. Powinno nastąpić przekierowanie na stronę logowania.

    Strona logowania aplikacji internetowej.

  4. Wybierz link z tekstem odnoszącym się do logowania. Aby rozpocząć proces uwierzytelniania, należy przekierować usługę Azure AD B2C.

  5. Po pomyślnym zalogowaniu powinien zostać wyświetlony przykład home page z przeglądarki.

    Pomyślne zalogowanie się aplikacji internetowej.

Rozwiązywanie problemów

W poniższych sekcjach opisano sposób rozwiązywania niektórych problemów, które mogą wystąpić.

Brak nazwy atrybutu w atrybutach

Podczas uruchamiania przykładu może zostać wyświetlony wyjątek z komunikatem Missing attribute 'name' in attributes. Dziennik tego wyjątku będzie wyglądać podobnie do następujących danych wyjściowych:

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]

Jeśli wystąpi ten błąd, sprawdź dwukrotnie przepływ pracy użytkownika utworzony w artykule Samouczek: tworzenie przepływów użytkownika w usłudze Azure Active Directory B2C. Podczas tworzenia przepływu pracy użytkownika w obszarze Atrybuty użytkownika i oświadczenia należy wybrać atrybuty i oświadczenia dla nazwy wyświetlanej. Pamiętaj również, aby poprawnie skonfigurować user-name-attribute-name w pliku application.yml .

Logowanie przy użyciu pętli do punktu końcowego B2C

Ten problem jest najbardziej prawdopodobny ze względu na zanieczyszczone pliki cookie dla programu localhost. Wyczyść pliki cookie i localhost spróbuj ponownie.

Podsumowanie

W tym samouczku utworzono nową aplikację internetową Java przy użyciu szablonu startowego usługi Azure Active Directory B2C, skonfigurowano nową dzierżawę usługi Azure AD B2C i zarejestrowano w niej nową aplikację, a następnie skonfigurowano aplikację do używania adnotacji i klas Spring w celu ochrony aplikacji internetowej.

Czyszczenie zasobów

Gdy zasoby utworzone w tym artykule nie będą już potrzebne, usuń je w witrynie Azure Portal, aby uniknąć naliczania opłat.

Następne kroki

Aby dowiedzieć się więcej na temat oprogramowania Spring i platformy Azure, przejdź do centrum dokumentacji dotyczącej oprogramowania Spring na platformie Azure.