Udostępnij za pośrednictwem


Zabezpieczanie aplikacji Java Spring Boot przy użyciu usługi Azure Active Directory B2C

W tym artykule przedstawiono aplikację internetową Java Spring Boot, która loguje użytkowników w dzierżawie usługi Azure Active Directory B2C przy użyciu biblioteki klienta Azure AD B2C Spring Boot Starter dla języka Java. Używa on protokołu OpenID Connect.

Na poniższym diagramie przedstawiono topologię aplikacji:

Diagram przedstawiający topologię aplikacji.

Aplikacja kliencka używa biblioteki klienta startowego Spring Boot usługi Azure AD B2C dla języka Java do logowania użytkownika i uzyskiwania tokenu identyfikatora z usługi Azure AD B2C. Token identyfikatora potwierdza, że użytkownik jest uwierzytelniany w usłudze Azure AD B2C i umożliwia użytkownikowi dostęp do chronionych tras.

Wymagania wstępne

Zalecenia

  • Znajomość platformy Spring Framework.
  • Pewna znajomość terminalu systemu Linux/OSX.
  • jwt.ms na potrzeby inspekcji tokenów.
  • Program Fiddler do monitorowania aktywności sieci i rozwiązywania problemów.
  • Postępuj zgodnie z blogiem Microsoft Entra ID, aby być na bieżąco z najnowszymi wydarzeniami.

Konfigurowanie przykładu

W poniższych sekcjach pokazano, jak skonfigurować przykładową aplikację.

Klonowanie lub pobieranie przykładowego repozytorium

Aby sklonować przykład, otwórz okno powłoki Bash i użyj następującego polecenia:

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/1-Authentication/sign-in-b2c

Alternatywnie przejdź do repozytorium ms-identity-msal-java-samples , a następnie pobierz go jako plik .zip i wyodrębnij go na dysk twardy.

Ważne

Aby uniknąć ograniczeń długości ścieżki pliku w systemie Windows, sklonuj lub wyodrębnij repozytorium do katalogu w pobliżu katalogu głównego dysku twardego.

Ten przykład zawiera wstępnie wyrejestrowaną aplikację do celów demonstracyjnych. Jeśli chcesz użyć własnej dzierżawy i aplikacji usługi Azure AD B2C, zarejestruj i skonfiguruj aplikację w witrynie Azure Portal. Aby uzyskać więcej informacji, zobacz sekcję Rejestrowanie aplikacji . W przeciwnym razie wykonaj kroki opisane w sekcji Uruchamianie przykładu .

Wybierz dzierżawę usługi Azure AD B2C, w której chcesz utworzyć aplikacje

Aby wybrać dzierżawę, wykonaj następujące kroki:

  1. Zaloguj się w witrynie Azure Portal.

  2. Jeśli Twoje konto znajduje się w więcej niż jednej dzierżawie usługi Azure AD B2C, wybierz swój profil w rogu witryny Azure Portal, a następnie wybierz pozycję Przełącz katalog , aby zmienić sesję na żądaną dzierżawę usługi Azure AD B2C.

Tworzenie przepływów użytkownika i zasad niestandardowych

Aby utworzyć typowe przepływy użytkowników, takie jak rejestrowanie, logowanie, edytowanie profilu i resetowanie hasła, zobacz Samouczek: tworzenie przepływów użytkowników w usłudze Azure Active Directory B2C.

Należy również rozważyć utworzenie zasad niestandardowych w usłudze Azure Active Directory B2C. Jednak to zadanie wykracza poza zakres tego samouczka. Aby uzyskać więcej informacji, zobacz Omówienie zasad niestandardowych usługi Azure AD B2C.

Dodawanie zewnętrznych dostawców tożsamości

Zobacz Samouczek: dodawanie dostawców tożsamości do aplikacji w usłudze Azure Active Directory B2C.

Rejestrowanie aplikacji (java-spring-webapp-auth-b2c)

Aby zarejestrować aplikację, wykonaj następujące czynności:

  1. Przejdź do witryny Azure Portal i wybierz pozycję Azure AD B2C.

  2. Wybierz pozycję Rejestracje aplikacji w okienku nawigacji, a następnie wybierz pozycję Nowa rejestracja.

  3. Na wyświetlonej stronie Rejestrowanie aplikacji wprowadź następujące informacje o rejestracji aplikacji:

    • W sekcji Nazwa wprowadź zrozumiałą nazwę aplikacji do wyświetlania użytkownikom aplikacji — na przykład java-spring-webapp-auth-b2c.
    • W obszarze Obsługiwane typy kont wybierz Konta w dowolnym dostawcy tożsamości lub katalogu organizacyjnym (do uwierzytelniania użytkowników za pomocą przepływów użytkownika).
    • W sekcji Identyfikator URI przekierowania (opcjonalnie) wybierz pozycję Sieć Web w polu kombi i wprowadź następujący identyfikator URI przekierowania: http://localhost:8080/login/oauth2/code/.
  4. Wybierz pozycję Zarejestruj, aby utworzyć aplikację.

  5. Na stronie rejestracji aplikacji znajdź i skopiuj wartość Identyfikator aplikacji (klienta), aby użyć jej później. Ta wartość jest używana w pliku konfiguracji aplikacji lub plikach.

  6. Wybierz Zapisz, aby zapisać zmiany.

  7. Na stronie rejestracji aplikacji wybierz okienko Certyfikaty i wpisy tajne w okienku nawigacji, aby otworzyć stronę w celu wygenerowania wpisów tajnych i przekazania certyfikatów.

  8. W sekcji Klucze tajne klienta wybierz pozycję Nowy klucz tajny klienta.

  9. Wpisz opis — na przykład wpis tajny aplikacji.

  10. Wybierz jeden z dostępnych czasów trwania zgodnie z obawami dotyczącymi zabezpieczeń — na przykład w ciągu 2 lat.

  11. Wybierz Dodaj. Zostanie wyświetlona wygenerowana wartość.

  12. Skopiuj i zapisz wygenerowaną wartość do użycia w kolejnych krokach. Ta wartość jest potrzebna dla plików konfiguracji kodu. Ta wartość nie jest ponownie wyświetlana i nie można jej pobrać w żaden inny sposób. Dlatego przed przejściem do innego ekranu lub okienka pamiętaj, aby zapisać go w witrynie Azure Portal.

Konfigurowanie aplikacji (java-spring-webapp-auth-b2c) w celu korzystania z rejestracji aplikacji

Aby skonfigurować aplikację, wykonaj następujące kroki:

Uwaga

W poniższych krokach ClientID jest to samo co Application ID lub AppId.

  1. Otwórz projekt w środowisku IDE.

  2. Otwórz plik src/main/resources/application.yml.

  3. client-id Znajdź właściwość i zastąp istniejącą wartość identyfikatorem aplikacji lub clientId java-spring-webapp-auth-b2c aplikacją z witryny Azure Portal.

  4. client-secret Znajdź właściwość i zastąp istniejącą wartość wartością zapisaną podczas tworzenia java-spring-webapp-auth-b2c aplikacji w witrynie Azure Portal.

  5. base-uri Znajdź właściwość i zastąp dwa wystąpienia wartości fabrikamb2c nazwą dzierżawy usługi Azure AD B2C, w której utworzono aplikację java-spring-webapp-auth-b2c w witrynie Azure Portal.

  6. sign-up-or-sign-in Znajdź właściwość i zastąp ją nazwą zasad rejestracji/logowania utworzonych w dzierżawie usługi Azure AD B2C, w której utworzono aplikację java-spring-webapp-auth-b2c w witrynie Azure Portal.

  7. profile-edit Znajdź właściwość i zastąp ją nazwą zasad resetowania hasła utworzonych w dzierżawie usługi Azure AD B2C, w której utworzono aplikację java-spring-webapp-auth-b2c w witrynie Azure Portal.

  8. password-reset Znajdź właściwość i zastąp ją nazwą zasad przepływu użytkownika profilu edycji utworzonych w dzierżawie usługi Azure AD B2C, w której utworzono aplikację java-spring-webapp-auth-b2c w witrynie Azure Portal.

  9. Otwórz plik src/main/resources/templates/navbar.html.

  10. Znajdź odwołania do b2c_1_susi przepływów i i b2c_1_edit_profile zastąp sign-up-sign-in je swoimi przepływami i profile-edit użytkownikami.

Uruchamianie aplikacji przykładowej

W poniższych sekcjach pokazano, jak wdrożyć przykład w usłudze Azure Container Apps.

Wymagania wstępne

Przygotowywanie projektu Spring

Aby przygotować projekt, wykonaj następujące czynności:

  1. Użyj następującego polecenia narzędzia Maven , aby skompilować projekt:

    mvn clean verify
    
  2. Uruchom przykładowy projekt lokalnie, używając następującego polecenia:

    mvn spring-boot:run
    

Ustawienia

Aby zalogować się do platformy Azure z poziomu interfejsu wiersza polecenia, uruchom następujące polecenie i postępuj zgodnie z monitami, aby ukończyć proces uwierzytelniania.

az login

Aby upewnić się, że używasz najnowszej wersji interfejsu wiersza polecenia, uruchom polecenie uaktualniania.

az upgrade

Następnie zainstaluj lub zaktualizuj rozszerzenie usługi Azure Container Apps dla interfejsu wiersza polecenia.

Jeśli podczas uruchamiania az containerapp poleceń w interfejsie wiersza polecenia platformy Azure wystąpią błędy dotyczące brakujących parametrów, upewnij się, że masz zainstalowaną najnowszą wersję rozszerzenia Azure Container Apps.

az extension add --name containerapp --upgrade

Uwaga

Począwszy od maja 2024 r., rozszerzenia interfejsu wiersza polecenia platformy Azure domyślnie nie włączają funkcji w wersji zapoznawczej. Aby uzyskać dostęp do funkcji usługi Container Apps w wersji zapoznawczej, zainstaluj rozszerzenie Container Apps za pomocą polecenia --allow-preview true.

az extension add --name containerapp --upgrade --allow-preview true

Teraz, po zainstalowaniu bieżącego rozszerzenia lub modułu Microsoft.App , zarejestruj przestrzenie nazw i Microsoft.OperationalInsights .

Uwaga

Zasoby usługi Azure Container Apps zostały zmigrowane z Microsoft.Web przestrzeni nazw do Microsoft.App przestrzeni nazw. Aby uzyskać więcej informacji, zobacz Migracja przestrzeni nazw z witryny Microsoft.Web do Microsoft.App w marcu 2022 r.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Tworzenie środowiska usługi Azure Container Apps

Teraz, gdy konfiguracja interfejsu wiersza polecenia platformy Azure została ukończona, możesz zdefiniować zmienne środowiskowe używane w tym artykule.

Zdefiniuj następujące zmienne w powłoce powłoki bash.

export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"

Utwórz grupę zasobów.

az group create  \
    --name $RESOURCE_GROUP \
    --location $LOCATION \

Utwórz środowisko z automatycznie wygenerowanym obszarem roboczym usługi Log Analytics.

az containerapp env create \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION

Pokaż domyślną domenę środowiska aplikacji kontenera. Zanotuj tę domenę do użycia w kolejnych sekcjach.

az containerapp env show \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --query properties.defaultDomain

Przygotowywanie aplikacji do wdrożenia

Podczas wdrażania aplikacji w usłudze Azure Container Apps adres URL przekierowania zmienia się na adres URL przekierowania wdrożonego wystąpienia aplikacji w usłudze Azure Container Apps. Wykonaj następujące kroki, aby zmienić te ustawienia w pliku application.yml :

  1. Przejdź do pliku src\main\resources\application.yml aplikacji i zmień wartość post-logout-redirect-uri na nazwę domeny wdrożonej aplikacji, jak pokazano w poniższym przykładzie. Pamiętaj, aby zastąpić <API_NAME> wartości i <default-domain-of-container-app-environment> wartościami rzeczywistymi. Na przykład w przypadku domeny domyślnej dla środowiska aplikacji kontenera platformy Azure z poprzedniego kroku i ms-identity-api nazwy aplikacji należy użyć https://ms-identity-api.<default-domain> wartości post-logout-redirect-uri .

    post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
    
  2. Po zapisaniu tego pliku użyj następującego polecenia, aby ponownie skompilować aplikację:

    mvn clean package
    

Ważne

Plik application.yml aplikacji przechowuje obecnie wartość klucza tajnego klienta w parametrze client-secret . Nie jest dobrym rozwiązaniem, aby zachować tę wartość w tym pliku. Jeśli zatwierdzisz plik w repozytorium Git, możesz również podejmowania ryzyka. Aby zapoznać się z zalecanym podejściem, zobacz Zarządzanie wpisami tajnymi w usłudze Azure Container Apps.

Aktualizowanie rejestracji aplikacji Microsoft Entra ID

Ponieważ identyfikator URI przekierowania zmienia się w wdrożonej aplikacji w usłudze Azure Container Apps, musisz również zmienić identyfikator URI przekierowania w rejestracji aplikacji Microsoft Entra ID. Aby wprowadzić tę zmianę, wykonaj następujące czynności:

  1. Przejdź do strony Platforma tożsamości Microsoft dla deweloperów Rejestracje aplikacji.

  2. Użyj pola wyszukiwania, aby wyszukać rejestrację aplikacji — na przykład java-servlet-webapp-authentication.

  3. Otwórz rejestrację aplikacji, wybierając jej nazwę.

  4. Wybierz Uwierzytelnianie z menu poleceń.

  5. W sekcji Identyfikatory URI przekierowania sieci Web - wybierz pozycję Dodaj identyfikator URI.

  6. Wypełnij identyfikator URI aplikacji, dołączając /login/oauth2/code/ na przykład https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/.

  7. Wybierz pozycję Zapisz.

Wdrażanie aplikacji

Wdróż pakiet JAR w usłudze Azure Container Apps.

Uwaga

W razie potrzeby możesz określić wersję zestawu JDK w zmiennych środowiskowych kompilacji języka Java. Aby uzyskać więcej informacji, zobacz Kompilowanie zmiennych środowiskowych dla języka Java w usłudze Azure Container Apps.

Teraz możesz wdrożyć plik WAR za pomocą polecenia interfejsu az containerapp up wiersza polecenia.

az containerapp up \
    --name $API_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --environment $ENVIRONMENT \
    --artifact <JAR_FILE_PATH_AND_NAME> \
    --ingress external \
    --target-port 8080 \
    --query properties.configuration.ingress.fqdn

Uwaga

Domyślna wersja zestawu JDK to 17. Jeśli musisz zmienić wersję zestawu JDK pod kątem zgodności z aplikacją, możesz użyć argumentu --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION> , aby dostosować numer wersji.

Aby uzyskać więcej zmiennych środowiskowych kompilacji, zobacz Build environment variables for Java in Azure Container Apps (Tworzenie zmiennych środowiskowych dla języka Java w usłudze Azure Container Apps).

Weryfikowanie aplikacji

W tym przykładzie containerapp up polecenie zawiera --query properties.configuration.ingress.fqdn argument, który zwraca w pełni kwalifikowaną nazwę domeny (FQDN), znany również jako adres URL aplikacji. Wykonaj następujące kroki, aby sprawdzić dzienniki aplikacji w celu zbadania dowolnego problemu z wdrażaniem:

  1. Uzyskaj dostęp do adresu URL aplikacji wyjściowej na stronie Dane wyjściowe sekcji Wdrażanie.

  2. W okienku nawigacji na stronie Przegląd wystąpienia usługi Azure Container Apps wybierz pozycję Dzienniki, aby sprawdzić dzienniki aplikacji.

Eksplorowanie przykładu

Aby zapoznać się z przykładem, wykonaj następujące czynności:

  1. Zwróć uwagę na stan logowania lub wylogowania wyświetlany na środku ekranu.
  2. Wybierz przycisk kontekstowy w rogu. Ten przycisk odczytuje pozycję Zaloguj po pierwszym uruchomieniu aplikacji. Alternatywnie wybierz link do szczegółów tokenu. Ponieważ ta strona jest chroniona i wymaga uwierzytelniania, nastąpi automatyczne przekierowanie do strony logowania.
  3. Na następnej stronie postępuj zgodnie z instrukcjami i zaloguj się przy użyciu konta wybranego dostawcy tożsamości. Możesz również zarejestrować się lub zalogować się do konta lokalnego w dzierżawie B2C przy użyciu adresu e-mail.
  4. Po pomyślnym zakończeniu przepływu logowania powinno nastąpić przekierowanie do strony głównej , która pokazuje stan logowania — lub stronę szczegółów tokenu, w zależności od tego, który przycisk wyzwolił przepływ logowania.
  5. Zwróć uwagę, że przycisk kontekstowy zawiera teraz pozycję Wyloguj się i wyświetla swoją nazwę użytkownika.
  6. Jeśli jesteś na stronie głównej, wybierz pozycję Szczegóły tokenu identyfikatora, aby wyświetlić niektóre zdekodowane oświadczenia tokenu identyfikatora.
  7. Edytuj swój profil. Wybierz pozycję Edytuj profil , aby zmienić szczegóły, takie jak nazwa wyświetlana, miejsce zamieszkania i zawód.
  8. Użyj przycisku w rogu, aby się wylogować. Strona stanu odzwierciedla nowy stan.

Informacje o kodzie

W tym przykładzie pokazano, jak używać biblioteki klienta Startowego usługi Azure AD B2C Spring Boot dla języka Java w celu logowania użytkowników do dzierżawy usługi Azure AD B2C. Przykład korzysta również z szablonów startowych Spring Oauth2 Client i Spring Web Boot. W przykładzie użyto oświadczeń z tokenu identyfikatora uzyskanego z usługi Azure AD B2C, aby wyświetlić szczegóły zalogowanego użytkownika.

Zawartość

W poniższej tabeli przedstawiono zawartość przykładowego folderu projektu:

Plik/folder opis
pom.xml Zależności aplikacji.
src/main/resources/templates/ Szablony Thymeleaf dla interfejsu użytkownika.
src/main/resources/application.yml Konfiguracja biblioteki startowej aplikacji i programu Microsoft Entra Boot.
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ Ten katalog zawiera główne klasy wejścia aplikacji, kontrolera i konfiguracji.
.../MsIdentitySpringBootWebappApplication.java Klasa główna.
.../SampleController.java Kontroler z mapowaniami punktów końcowych.
.../SecurityConfig.java Konfiguracja zabezpieczeń — na przykład trasy wymagają uwierzytelniania.
.../Utilities.java Klasa narzędzia — na przykład filtruj oświadczenia tokenu identyfikatora.
CHANGELOG.md Lista zmian w przykładzie.
CONTRIBUTING.md Wskazówki dotyczące współtworzenia przykładu.
LICENCJA Licencja dla przykładu.

Oświadczenia tokenu identyfikatora

Aby wyodrębnić szczegóły tokenu, aplikacja korzysta z obiektów i OidcUser obiektów spring security AuthenticationPrincipal w mapowaniu żądań, jak pokazano w poniższym przykładzie, jak pokazano w poniższym przykładzie. Zobacz Przykładowy kontroler, aby uzyskać szczegółowe informacje na temat sposobu korzystania z oświadczeń tokenu identyfikatora.

import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
    Map<String, Object> claims = principal.getIdToken().getClaims();
}

W przypadku logowania aplikacja wysyła żądanie do punktu końcowego logowania usługi Azure AD B2C automatycznie skonfigurowanego przez bibliotekę klienta Azure AD B2C Spring Boot Starter dla języka Java, jak pokazano w poniższym przykładzie:

<a class="btn btn-success" href="/oauth2/authorization/{your-sign-up-sign-in-user-flow}">Sign In</a>

W przypadku wylogowania aplikacja wysyła żądanie POST do punktu końcowego logout , jak pokazano w poniższym przykładzie:

<form action="#" th:action="@{/logout}" method="post">
  <input class="btn btn-warning" type="submit" value="Sign Out" />
</form>

Elementy interfejsu użytkownika zależne od uwierzytelniania

Aplikacja ma prostą logikę na stronach szablonu interfejsu użytkownika do określania zawartości do wyświetlenia na podstawie tego, czy użytkownik jest uwierzytelniony, jak pokazano w poniższym przykładzie przy użyciu tagów Spring Security Thymeleaf:

<div sec:authorize="isAuthenticated()">
  this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
  this content only shows to not-authenticated users
</div>

Ochrona tras za pomocą polecenia WebSecurityConfigurerAdapter

Domyślnie aplikacja chroni stronę Szczegóły tokenu identyfikatora, aby tylko zalogowani użytkownicy mogli do niej uzyskać dostęp. Aplikacja konfiguruje te trasy z app.protect.authenticated właściwości z pliku application.yml . Aby skonfigurować określone wymagania aplikacji, możesz rozszerzyć WebSecurityConfigurerAdapter w jednej z klas. Aby zapoznać się z przykładem, zobacz klasę SecurityConfig tej aplikacji, pokazaną w następującym kodzie:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${app.protect.authenticated}")
    private String[] protectedRoutes;

    private final AADB2COidcLoginConfigurer configurer;

    public SecurityConfig(AADB2COidcLoginConfigurer configurer) {
        this.configurer = configurer;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeRequests()
            .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details)
            .antMatchers("/**").permitAll()                  // allow all other routes.
            .and()
            .apply(configurer)
            ;
        // @formatter:off
    }
}

Więcej informacji

Aby uzyskać więcej informacji na temat sposobu działania protokołów OAuth 2.0 w tym scenariuszu i innych scenariuszach, zobacz Scenariusze uwierzytelniania dla identyfikatora Entra firmy Microsoft.