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
- Subskrypcja platformy Azure. Jeśli jeszcze go nie masz, przed rozpoczęciem utwórz bezpłatne konto .
- Obsługiwany zestaw Java Development Kit (JDK). Aby uzyskać więcej informacji na temat zestawów JDK dostępnych do użycia podczas tworzenia aplikacji na platformie Azure, zobacz Obsługa języka Java na platformie Azure i w usłudze Azure Stack.
- Apache Maven, wersja 3.0 lub nowsza.
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
Przejdź do https://start.spring.io/.
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 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 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ą.
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
Zaloguj się w witrynie https://portal.azure.com.
Wybierz pozycję Utwórz zasób. Wyszukaj usługę Azure Active Directory B2C.
Wybierz pozycję Utwórz.
Wybierz Stwórz nową dzierżawę B2C Azure AD.
W polu Nazwa organizacji i Początkowa nazwa domeny podaj odpowiednie wartości, a następnie wybierz pozycję Utwórz.
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.
Dodawanie rejestracji aplikacji dla aplikacji Spring Boot
W okienku Zarządzanie wybierz pozycję Rejestracje aplikacji, a następnie wybierz pozycję Nowa rejestracja.
W polu Nazwa wprowadź nazwę aplikacji, a następnie wybierz pozycję Zarejestruj.
Po powrocie do okienka Zarządzanie wybierz pozycję Rejestracje aplikacji, a następnie wybierz utworzoną nazwę aplikacji.
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.
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.
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
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.
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
webapp1
elementu , 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.
Z wiersza polecenia przejdź do katalogu, w którym rozpakujesz plik .zip pobrany z narzędzia Spring Initializr.
Przejdź do folderu nadrzędnego projektu i otwórz plik projektu pom.xml Maven w edytorze tekstów.
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-b2c
użyj najnowszej dostępnej wersji. Możesz użyć mvnrepository.com do wyszukania tego.W przypadku elementu
spring-boot-starter-thymeleaf
użyj wersji odpowiadającej wybranej powyżej wersji środowiska Spring Boot, na przykład2.3.4.RELEASE
.W przypadku
thymeleaf-extras-springsecurity5
programu użyj najnowszej dostępnej wersji. Możesz użyć mvnrepository.com do wyszukania tego. Zgodnie z tym zapisem najnowsza wersja to3.0.4.RELEASE
.Zapisz i zamknij plik pom.xml.
- Sprawdź, czy zależności są poprawne, uruchamiając polecenie
mvn -DskipTests clean install
. Jeśli nie widziszBUILD SUCCESS
polecenia , przed kontynuowaniem rozwiąż problem i rozwiąż go.
- Sprawdź, czy zależności są poprawne, uruchamiając polecenie
Przejdź do folderu src/main/resources w projekcie i utwórz plik application.yml w edytorze tekstów.
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.
Zapisz i zamknij plik application.yml.
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.Utwórz nowy plik Java o nazwie WebController.java w folderze controller i otwórz go w edytorze tekstów.
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łujemodel.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}
. Zwracaneuser.getAttributes()
wartości są w rzeczywistości oświadczeniamiid_token
uwierzytelniania. Pełną listę dostępnych oświadczeń znajduje się na liście Platforma tożsamości Microsoft tokenów identyfikatorów.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.Utwórz nowy plik Java o nazwie WebSecurityConfiguration.java w folderze security i otwórz go w edytorze tekstów.
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) ; } }
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
Otwórz wiersz polecenia i zmień katalog na folder, w którym znajduje się plik pom.xml.
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
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.Wybierz link z tekstem odnoszącym się do logowania. Aby rozpocząć proces uwierzytelniania, należy przekierować usługę Azure AD B2C.
Po pomyślnym zalogowaniu powinien zostać wyświetlony przykład
home page
z przeglądarki.
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.