Włączanie logowania dla aplikacji Java WebSphere przy użyciu biblioteki MSAL4J z usługą Azure Active Directory B2C

W tym artykule przedstawiono aplikację serwletu Java, która uwierzytelnia użytkowników za pomocą usługi Azure Active Directory B2C (Azure AD B2C) przy użyciu biblioteki Microsoft Authentication Library for Java (MSAL4J).

Uwaga

Od 1 maja 2025 r. Azure Active Directory B2C nie jest już dostępna do zakupu dla nowych klientów. Istniejący klienci mogą nadal korzystać z usługi Azure AD B2C z obsługą techniczną do co najmniej maja 2030 r. W przypadku nowych projektów zarządzania tożsamościami klientów i dostępem (CIAM) użyj Tożsamość zewnętrzna Microsoft Entra zamiast tego.

Na poniższym diagramie przedstawiono topologię aplikacji:

Diagram przedstawiający topologię aplikacji.

Aplikacja używa biblioteki MSAL4J do logowania użytkowników i uzyskiwania tokenu identyfikatora z usługi Azure AD B2C. Token ID potwierdza, że użytkownik jest uwierzytelniony w dzierżawie Azure AD B2C.

Wymagania wstępne

  • JDK w wersji 8 lub nowszej
  • Maven 3
  • Dzierżawa usługi Azure AD B2C. Aby uzyskać więcej informacji, zobacz Samouczek: tworzenie dzierżawy Azure Active Directory B2C
  • Konto użytkownika w dzierżawie usługi Azure AD B2C.
  • WebSphere
  • Visual Studio Code
  • Narzędzia platformy Azure dla programu Visual Studio Code

Zalecenia

  • Podstawowa znajomość serwletów Java / Jakarta.
  • Pewna znajomość terminalu systemu Linux/OSX.
  • jwt.ms do inspekcji tokenów.
  • Fiddler do monitorowania aktywności sieciowej i diagnozowania problemów.
  • Śledź blog Microsoft Entra, aby być na bieżąco z najnowszymi informacjami.

Skonfiguruj przykład

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 3-java-servlet-web-app/1-Authentication/sign-in-b2c

Alternatywnie, przejdź do repozytorium ms-identity-msal-java-samples, a następnie pobierz je jako plik .zip i rozpakuj na dysku twardym.

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.

Zarejestruj przykładową aplikację w dzierżawie Azure AD B2C

Przykład zawiera wcześniej zarejestrowaną aplikację na potrzeby testów. Jeśli chcesz korzystać z własnej dzierżawy i aplikacji Azure AD B2C, wykonaj czynności opisane w poniższych sekcjach, aby zarejestrować i skonfigurować aplikację w portalu Azure. W przeciwnym razie przejdź do kroków opisanych w sekcji Uruchamianie przykładu.

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

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

  1. Zaloguj się do portalu Azure.

  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 portalu Azure, a następnie wybierz Przełącz katalog, aby przełączyć sesję do żądanej dzierżawy usługi Azure AD B2C.

Utwórz przepływy użytkowników i zasady niestandardowe

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

Należy również rozważyć utworzenie zasad niestandardowych w usłudze Azure Active Directory B2C, jednak wykracza to poza zakres tego samouczka.

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

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

Rejestrowanie aplikacji (ms-identity-b2c-java-servlet-webapp-authentication)

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

  1. Przejdź do witryny Azure portal i wybierz 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 dotyczące rejestracji aplikacji:

    • W sekcji Nazwa wprowadź znaczącą nazwę aplikacji wyświetlaną użytkownikom aplikacji — na przykład .
    • W obszarze Obsługiwane typy kont wybierz pozycję Konta w dowolnym katalogu organizacyjnym i osobiste konta Microsoft (np. Skype, Xbox, Outlook.com).
    • W sekcji URI przekierowania (opcjonalnie) wybierz Web w polu kombi i wprowadź następujący identyfikator URI przekierowania: .
  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. Używasz tej wartości w pliku konfiguracyjnym aplikacji lub w plikach konfiguracyjnych aplikacji.

  6. Wybierz Zapisz, aby zapisać zmiany.

  7. Na stronie rejestracji aplikacji wybierz pozycję Certificates & secrets w panelu nawigacyjnym, aby otworzyć stronę, na której można wygenerować klucze tajne i przekazać certyfikaty.

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

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

  10. Wybierz datę wygaśnięcia klucza tajnego lub określ niestandardowy okres ważności. Klucze tajne klienta mogą mieć maksymalny okres ważności wynoszący 24 miesiące, a firma Microsoft zaleca okres ważności krótszy niż 12 miesięcy. W przypadku aplikacji produkcyjnych preferuj certyfikat lub poświadczenie federacyjne tożsamości zamiast klucza tajnego klienta.

  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.

Skonfiguruj aplikację (ms-identity-b2c-java-servlet-webapp-authentication), aby używała rejestracji Twojej aplikacji

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

Uwaga

W poniższych krokach oznacza to samo co lub .

  1. Otwórz projekt w środowisku IDE.

  2. Otwórz plik ./src/main/resources/authentication.properties.

  3. Znajdź właściwość i zastąp istniejącą wartość identyfikatorem aplikacji lub aplikacji z witryny Azure Portal.

  4. Znajdź właściwość i zastąp istniejącą wartość wartością zachowaną podczas tworzenia aplikacji w portalu Azure.

  5. Znajdź właściwość i zastąp istniejący clientId aplikacji wartością umieszczoną w w kroku 1 tej sekcji.

  6. Znajdź właściwość aad.authority i zastąp pierwsze wystąpienie fabrikamb2c nazwą dzierżawy usługi Azure AD B2C, w której utworzono aplikację ms-identity-b2c-java-servlet-webapp-authentication w portalu Azure.

  7. Znajdź właściwość i zastąp drugie wystąpienie elementu nazwą dzierżawy Azure AD B2C, w której utworzono aplikację w portalu Azure.

  8. Znajdź właściwość i zastąp ją nazwą zasady przepływu użytkownika rejestracji/logowania utworzonej w dzierżawie Azure AD B2C, w której utworzono aplikację w portalu Azure.

  9. Znajdź właściwość i zastąp ją nazwą zasad przepływu użytkownika resetowania hasła, które zostały utworzone w dzierżawie Azure AD B2C, w której w portalu Azure utworzono aplikację .

  10. Znajdź właściwość i zastąp ją nazwą zasad przepływu użytkownika służących do edycji profilu, utworzonych w dzierżawie usługi Azure AD B2C, w której utworzono aplikację w portalu Azure.

Skompiluj przykład

Aby skompilować przykład przy użyciu narzędzia Maven, przejdź do katalogu zawierającego plik pom.xml dla przykładu, a następnie uruchom następujące polecenie:

mvn clean package

To polecenie generuje plik war , który można uruchomić na różnych serwerach aplikacji.

Uruchamianie aplikacji przykładowej

W tych instrukcjach przyjęto założenie, że zainstalowano aplikację WebSphere i skonfigurowano serwer. Możesz skorzystać ze wskazówek zawartych w Deploy WebSphere Application Server (traditional) Cluster on Azure Virtual Machines na potrzeby podstawowej konfiguracji serwera.

Przed wdrożeniem w usłudze WebSphere wykonaj następujące kroki, aby wprowadzić pewne zmiany konfiguracji w samym przykładzie, a następnie skompilować lub ponownie skompilować pakiet:

  1. Przejdź do pliku authentication.properties aplikacji i zmień wartość na adres URL serwera oraz numer portu, których zamierzasz użyć, jak pokazano w poniższym przykładzie:

    # app.homePage is by default set to dev server address and app context path on the server
    # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net
    app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/
    
  2. Po zapisaniu tego pliku użyj następującego polecenia, aby ponownie skompilować aplikację:

    mvn clean package
    
  3. Po zakończeniu kompilacji skopiuj plik .war do systemu plików na serwerze docelowym.

Musisz również wprowadzić tę samą zmianę w rejestracji aplikacji Azure, gdzie ustawiasz ją w portalu Azure jako wartość Redirect URI na karcie Authentication.

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

  2. Użyj pola wyszukiwania, aby znaleźć rejestrację aplikacji — na przykład .

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

  4. Wybierz Uwierzytelnianie z menu.

  5. W sekcji WebIdentyfikatory URI przekierowania wybierz pozycję Dodaj identyfikator URI.

  6. Wpisz identyfikator URI swojej aplikacji, dodając na końcu /auth/redirect — na przykład .

  7. Wybierz Zapisz.

Wykonaj następujące kroki, aby wdrożyć przykład przy użyciu konsoli zintegrowanych rozwiązań WebSphere:

  1. Na karcie Aplikacje wybierz pozycję Nowa aplikacja, a następnie pozycję Nowa aplikacja dla przedsiębiorstw.

  2. Wybierz utworzony plik .war, a następnie wybieraj przycisk Dalej, aż przejdziesz do kroku instalacji Mapowanie ścieżek głównych kontekstu dla modułów sieci Web. Inne ustawienia domyślne powinny być poprawne.

  3. Dla głównego kontekstu ustaw taką samą wartość jak ta występująca po numerze portu w elemencie „Redirect URI” ustawionym w przykładowej konfiguracji / rejestracji aplikacji w Azure. Oznacza to, że jeśli URI przekierowania to , główny katalog kontekstu powinien mieć wartość .

  4. Wybierz Zakończ.

  5. Po zakończeniu instalowania aplikacji przejdź do sekcji Aplikacje dla przedsiębiorstw WebSphere na karcie Aplikacje .

  6. Wybierz z listy aplikacji zainstalowany plik .war, a następnie wybierz opcję Uruchom, aby wdrożyć.

  7. Po zakończeniu wdrażania przejdź do , a aplikacja powinna być widoczna.

Poznaj przykład

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 ma napis Zaloguj się przy pierwszym uruchomieniu aplikacji.
  3. Na następnej stronie postępuj zgodnie z instrukcjami i zaloguj się przy użyciu konta wybranego dostawcy tożsamości.
  4. Zwróć uwagę, że przycisk kontekstowy zawiera teraz pozycję Wyloguj się i wyświetla swoją nazwę użytkownika.
  5. Wybierz pozycję Szczegóły tokenu identyfikatora, aby zobaczyć niektóre zdekodowane oświadczenia tokenu identyfikatora.
  6. Istnieje również możliwość edytowania profilu. Wybierz link, aby edytować szczegóły, takie jak nazwa wyświetlana, miejsce zamieszkania i zawód.
  7. Użyj przycisku w rogu, aby się wylogować.
  8. Po wylogowaniu przejdź do następującego adresu URL strony ze szczegółami tokenu: . Tutaj możesz zobaczyć, jak aplikacja wyświetla błąd zamiast claimów tokenu ID.

Informacje o kodzie

W tym przykładzie pokazano, jak używać biblioteki MSAL4J do logowania użytkowników do dzierżawy usługi Azure AD B2C.

Zawartość

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

Plik/folder Opis
AuthHelper.java Funkcje pomocnika na potrzeby uwierzytelniania.
Config.java Uruchamia się przy uruchamianiu i konfiguruje czytnik właściwości i rejestrator.
authentication.properties Microsoft Entra ID i konfiguracja programu.
AuthenticationFilter.java Przekierowuje nieuwierzytelnione żądania do chronionych zasobów na stronie 401.
MsalAuthSession Tworzone przy użyciu elementu . Przechowuje wszystkie atrybuty sesji powiązanej z biblioteką MSAL w atrybucie sesji.
*Servlet.java Wszystkie dostępne punkty końcowe są definiowane w klasach Języka Java z nazwami kończącymi się na Servlet..
CHANGELOG.md Lista zmian w przykładzie.
CONTRIBUTING.md Wskazówki dotyczące wnoszenia wkładu do przykładu.
LICENCJA Licencja przykładu.

ConfidentialClientApplication

Instancja jest tworzona w pliku AuthHelper.java, jak pokazano w poniższym przykładzie. Ten obiekt ułatwia utworzenie adresu URL autoryzacji usługi Azure AD B2C, a także pomaga w wymianie tokenu uwierzytelniania dla tokenu dostępu.

IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .b2cAuthority(AUTHORITY + policy)
                     .build();

Następujące parametry są używane do tworzenia instancji:

  • Identyfikator klienta aplikacji.
  • Klucz tajny klienta, który jest wymagany w przypadku poufnych aplikacji klienckich.
  • Adres URL urzędu Azure AD B2C połączony z odpowiednim na potrzeby rejestracji, logowania, edycji profilu lub resetowania hasła.

W tym przykładzie wartości te są odczytywane z pliku authentication.properties przy użyciu czytnika właściwości w pliku Config.java.

Przewodnik krok po kroku

Poniższe kroki zawierają przewodnik po funkcjonalności aplikacji:

  1. Pierwszym krokiem procesu logowania jest wysłanie żądania do punktu końcowego dla Twojej dzierżawy Azure Active Directory B2C. Instancja MSAL4J służy do utworzenia adresu URL żądania autoryzacji, a aplikacja przekierowuje przeglądarkę na ten adres URL, jak pokazano w poniższym przykładzie:

    final ConfidentialClientApplication client = getConfidentialClientInstance(policy);
    final AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters
        .builder(REDIRECT_URI, Collections.singleton(SCOPES)).responseMode(ResponseMode.QUERY)
        .prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String redirectUrl = client.getAuthorizationRequestUrl(parameters).toString();
    Config.logger.log(Level.INFO, "Redirecting user to {0}", redirectUrl);
    resp.setStatus(302);
    resp.sendRedirect(redirectUrl);
    

    Poniższa lista zawiera opis funkcji tego kodu:

    • : Parametry, które należy ustawić, aby utworzyć obiekt AuthorizationRequestUrl.

    • : miejsce, do którego usługa Azure AD B2C przekierowuje przeglądarkę — wraz z kodem autoryzacyjnym — po zebraniu danych logowania użytkownika.

    • : Zakresy to uprawnienia żądane przez aplikację.

      Zwykle trzy zakresy wystarczyłyby, aby otrzymać odpowiedź zawierającą token identyfikacyjny. Jednak biblioteka MSAL4J wymaga, aby wszystkie odpowiedzi z usługi Azure AD B2C zawierały również token dostępu.

      Aby usługa Azure AD B2C zrezygnowała z tokenu dostępu, a także tokenu identyfikatora, żądanie musi zawierać dodatkowy zakres zasobów. Ponieważ ta aplikacja w rzeczywistości nie wymaga zewnętrznego zakresu zasobów, dodaje własny identyfikator klienta jako czwarty zakres w celu otrzymania tokenu dostępu.

      Pełną listę zakresów żądanych przez aplikację można znaleźć w pliku authentication.properties .

    • : Usługa Azure AD B2C może zwrócić odpowiedź jako parametry formularza w żądaniu HTTP POST lub jako parametry ciągu zapytania w żądaniu HTTP GET.

    • : Usługa Azure AD B2C powinna poprosić użytkownika o wybranie konta, za pomocą którego chce się uwierzytelnić.

    • : Unikatowa zmienna ustawiana przez aplikację w sesji przy każdym żądaniu tokenu i usuwana po otrzymaniu odpowiedniego zwrotnego wywołania przekierowania z usługi Azure AD B2C. Zmienna stanu zapewnia, że żądania usługi Azure AD B2C do elementu rzeczywiście pochodzą z żądań autoryzacji usługi Azure AD B2C zainicjowanych przez tę aplikację i w ramach tej sesji, zapobiegając tym samym atakom CSRF. Odbywa się to w pliku AADRedirectServlet.java .

    • : unikatowa zmienna ustawiana przez aplikację w sesji przy każdym żądaniu tokenu i usuwana po otrzymaniu odpowiadającego mu tokenu. Ta wartość nonce jest przenoszona do wynikowych tokenów wydawanych przez usługę Azure AD B2C, co zapewnia, że nie dochodzi do ataku powtórzeniowego tokenu.

  2. Usługa Azure Active Directory B2C wyświetla użytkownikowi monit logowania. Jeśli próba logowania zakończy się pomyślnie, przeglądarka użytkownika zostanie przekierowana do punktu końcowego przekierowania aplikacji. Prawidłowe żądanie wysłane do tego punktu końcowego zawiera kod autoryzacji.

  3. Następnie instancja wymienia ten kod autoryzacji na token ID i token dostępu z usługi Azure Active Directory B2C, jak pokazano w poniższym przykładzie:

    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                        .builder(authCode, new URI(REDIRECT_URI))
                        .scopes(Collections.singleton(SCOPES)).build();
    
    final ConfidentialClientApplication client = AuthHelper
            .getConfidentialClientInstance(policy);
    final Future<IAuthenticationResult> future = client.acquireToken(authParams);
    final IAuthenticationResult result = future.get();
    

    Poniższa lista zawiera opis funkcji tego kodu:

    • : Parametry, które muszą zostać ustawione, aby wymienić kod autoryzacyjny na token identyfikacyjny i/lub token dostępu.
    • : Kod autoryzacji otrzymany w punkcie końcowym przekierowania.
    • : URI przekierowania użyty w poprzednim kroku należy ponownie przekazać.
    • : Zakresy użyte w poprzednim kroku należy ponownie przekazać.
  4. Jeśli zakończy się powodzeniem, oświadczenia zawarte w tokenie zostaną wyodrębnione, a oświadczenie nonce zostanie zweryfikowane względem wartości nonce przechowywanej w sesji, jak pokazano w poniższym przykładzie:

    parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache);
    validateNonce(msalAuth)
    processSuccessfulAuthentication(msalAuth);
    
  5. Jeśli nonce zostanie pomyślnie zweryfikowany, stan uwierzytelnienia jest zapisywany w sesji po stronie serwera z wykorzystaniem metod udostępnianych przez klasę , jak pokazano w poniższym przykładzie:

    msalAuth.setAuthenticated(true);
    msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
    

Więcej informacji

  • Co to jest usługa Azure Active Directory B2C?
  • Typy aplikacji, które można używać w usłudze Active Directory B2C
  • Zalecenia i najlepsze rozwiązania dotyczące usługi Azure Active Directory B2C
  • Sesja usługi Azure AD B2C
  • Biblioteka Microsoft Authentication Library (MSAL) dla języka Java

Aby uzyskać więcej informacji o tym, jak działają protokoły OAuth 2.0 w tym scenariuszu i innych scenariuszach, zobacz Scenariusze uwierzytelniania dla Microsoft Entra ID.

Następny krok

Wdrażanie aplikacji Java WebSphere w tradycyjnym środowisku WebSphere na maszynach wirtualnych platformy Azure