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 funkcją logowania przy użyciu Spring Initializr za pomocą szablonu startowego Spring Boot dla identyfikatora Entra firmy Microsoft.

Z tego samouczka dowiesz się, jak wykonywać następujące działania:

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

Microsoft Entra ID to rozwiązanie tożsamości korporacyjnej w chmurze 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).

Warunki wstępne

  • Subskrypcja platformy Azure. Jeśli jeszcze go nie masz, przed rozpoczęciem utwórz bezpłatne konto .
  • Obsługiwany pakiet Java Development Kit (JDK). Aby uzyskać więcej informacji na temat zestawów JDK dostępnych przy tworzeniu aplikacji na platformie Azure, zobacz wsparcie dla języka Java na platformie Azure i Azure Stack.
  • Apache Maven w wersji 3.0 lub nowszej.

Ważny

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 tymi wskazówkami. Etykiety i układ mogą się różnić od przedstawionego tutaj obrazu.

    • W obszarze Projectwybierz Maven Project.
    • W obszarze Languagewybierz pozycję Java.
    • W sekcji Spring Bootwybierz 2.7.11.
    • Pod Grupa, Artefakt i 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 na Spring Web oraz na Spring Security.

    Notatka

    Spring Security 5.5.1, 5.4.7, 5.3.10 i 5.2.11 zostały wydane, aby rozwiązać następujący raport CVE: CVE-2021-22119, atak typu DoS (odmowa usługi) z wykorzystaniem spring-security-oauth2-client. Jeśli używasz starszej wersji, uaktualnij ją.

  3. Wybierz opcję Wygeneruj projekt, a następnie pobierz projekt do lokalnego folderu na komputerze. 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ą, którą wprowadzono dla grupy 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ę do https://portal.azure.com.

  2. Wybierz pozycję Utwórz zasób. Wyszukaj 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 Azure Marketplace dla usługi Azure Active Directory B2C.

  4. Wybierz pozycję Utwórz nową dzierżawę usługi Azure AD B2C.

    opcja portalu Azure, aby utworzyć nową dzierżawę usługi Azure AD B2C.

  5. Wprowadź odpowiednie wartości dla nazwy organizacji oraz początkowej nazwy domeny, a następnie wybierz Utwórz.

    ekran tworzenia dzierżawy dla usługi 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 najemcy. Następnie wyszukaj b2c, a następnie wybierz pozycję Azure AD B2C.

    Znajdź usługę Azure AD B2C.

Dodaj rejestrację aplikacji dla swojej 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 rejestracji aplikacji usługi Azure AD B2C.

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

    formularz rejestracji aplikacji w usłudze Azure AD B2C.

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

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

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

    opcje wybrane do uwierzytelniania, dodaj platformę, internet.

    Skonfiguruj ekran sieci Web z wybranym polem przekierowań URI.

Dodaj tajne dane dla swojej aplikacji

Wybierz pozycję Certyfikaty & tajemnice, następnie Nowe tajemnice klienta. Wprowadź swój tajny opis, a następnie wybierz 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 tajnego klienta.

Ekran z certyfikatami i tajnymi wpisami z zaznaczonym przyciskiem kopiowania.

Notatka

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

Dodaj przepływ użytkownika

  1. Przejdź do strony głównej dzierżawy. W sekcji zasady okienka 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. Kilka rzeczy, które należy wziąć pod uwagę podczas korzystania z innego samouczka.

    • Zacznij od kroku, który wymaga wybrania Nowy przebieg dla użytkownika.
    • Gdy ten samouczek odwołuje się do webapp1, zamiast tego użyj wartości, którą wprowadziłeś dla grupy .
    • Po wybraniu oświadczeń, które mają być zwracane z przepływów, upewnij się, że wybrano nazwa wyświetlana. Bez tej zgody 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 Samouczek: tworzenie przepływów użytkowników 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 GitHub, zobacz Konfigurowanie rejestracji i logowania za pomocą konta GitHub przy użyciu usługi Azure Active Directory B2C.

Konfigurowanie i kompilowanie aplikacji

Teraz, gdy utworzyłeś wystąpienie Azure AD B2C i kilka przepływów użytkownika, połączysz aplikację Spring z wystąpieniem Azure AD B2C.

  1. Z wiersza polecenia użyj polecenia cd, aby przejść do katalogu, w którym rozpakowałeś 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 spring-cloud-azure-starter-active-directory-b2cużyj najnowszej dostępnej wersji. Może Pani/Pan użyć mvnrepository.com, żeby to wyszukać.

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

    W przypadku thymeleaf-extras-springsecurity5użyj najnowszej dostępnej wersji. Możesz użyć mvnrepository.com do wyszukania tego. Na chwilę obecną najnowsza wersja to 3.0.4.RELEASE.

  4. Zapisz i zamknij plik pom.xml.

    • Sprawdź, czy zależności są poprawne, uruchamiając mvn -DskipTests clean install. Zdiagnozuj i usuń problem, jeśli nie widzisz BUILD SUCCESS, zanim będziesz kontynuować.
  5. Przejdź do folderu src/main/resources w projekcie i utwórz plik application.yml w edytorze tekstów.

  6. Określ ustawienia 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 wartość client-secret jest ujęta w apostrofach. Jest to konieczne, ponieważ wartość <secret-value> prawie na pewno będzie zawierać niektóre znaki, które muszą być umieszczone wewnątrz pojedynczych apostrofów w języku YAML.

    Notatka

    Na chwilę obecną pełna lista wartości dla integracji usługi Active Directory B2C Spring, które dostępne są 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 spring-cloud-azure-starter-active-directory-b2c przykładzie: aad-b2c-web-application na GitHubie.

  7. Zapisz i zamknij plik application.yml.

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

  9. Utwórz nowy plik Java o nazwie WebController.java w folderze kontrolera 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(), a ta metoda wywołuje model.addAllAttributes(user.getAttributes());, każda strona HTML w src/main/resources/templates jest w stanie uzyskać dostęp do dowolnego z tych atrybutów, takich jak ${name}, ${grant_type}lub ${auth_time}. Wartości zwracane z user.getAttributes() są w rzeczywistości żądaniami dostępu id_token do celu uwierzytelniania. Pełna lista dostępnych oświadczeń znajduje się na liście tokenów identyfikatorów platformy tożsamości firmy Microsoft.

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

  12. Utwórz nowy plik Java o nazwie WebSecurityConfiguration.java w folderze zabezpieczeń 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 spring-cloud-azure-starter-active-directory-b2c przykładu: aad-b2c-web-application do src/main/resources/templatesi zastąp ${your-profile-edit-user-flow} oraz ${your-password-reset-user-flow} nazwami przepływów użytkownika, które utworzyłeś wcześniej.

Kompilowanie i testowanie aplikacji

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

  2. Skompiluj aplikację Spring Boot za pomocą narzędzia Maven i uruchom ją; na przykład:

    Notatka

    Niezwykle ważne jest, aby czas zgodny z zegarem systemowym, według którego działa lokalna aplikacja Spring Boot, był dokładny. 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. Na moment pisania tego tekstu time.gov ma wskaźnik, jak bardzo twój zegar różni się od rzeczywistego czasu. Aplikacja została pomyślnie uruchomiona z odchyleniem +0,019 sekundy.

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

    strona logowania aplikacji internetowej.

  4. Wybierz link z tekstem odnoszącym się do logowania. Aby rozpocząć proces uwierzytelniania, powinieneś zostać przekierowany do Azure AD B2C.

  5. Po pomyślnym zalogowaniu powinien zostać wyświetlony w przeglądarce przykładowy home page.

    pomyślne logowanie do 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. Log 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 Samouczek: tworzenie przepływów użytkownika w usłudze Azure Active Directory B2C. Podczas tworzenia przepływu pracy użytkownika dla atrybutów użytkownika i deklaracji, pamiętaj o wyborze atrybutów i deklaracji dla nazwy wyświetlanej. Ponadto należy prawidłowo 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 localhost. Wyczyść pliki cookie dla localhost i spróbuj ponownie.

Streszczenie

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, użyj portalu Azure, aby je usunąć i uniknąć nieoczekiwanych opłat.

Następne kroki

Aby dowiedzieć się więcej na temat platformy Spring i platformy Azure, przejdź do Centrum dokumentacji platformy Azure.