Přidání přihlášení pomocí Azure Active Directory B2C do webové aplikace Spring

V tomto článku se dozvíte, jak vytvořit aplikaci v Javě s funkcí přihlašování pomocí Aplikace Spring Initializr s úvodní aplikací Spring Boot pro Microsoft Entra ID.

V tomto kurzu se naučíte:

  • Vytvoření aplikace v Javě pomocí aplikace Spring Initializr
  • Konfigurace Azure Active Directory B2C
  • Zabezpečení aplikace s využitím tříd a poznámek Spring Boot
  • Sestavení a otestování aplikace v Javě

Microsoft Entra ID je řešení podnikové identity v cloudovém měřítku od Microsoftu. Azure Active Directory B2C doplňuje sadu funkcí Microsoft Entra ID, která umožňuje spravovat přístup zákazníků, spotřebitelů a občanů k vašim aplikacím B2C (business-to-consumer).

Požadavky

Důležité

K dokončení kroků v tomto článku se vyžaduje Spring Boot verze 2.5 nebo vyšší.

Vytvoření aplikace pomocí aplikace Spring Initializr

  1. Přejděte na https://start.spring.io/.

  2. Vyplňte hodnoty podle těchto pokynů. Popisky a rozložení se můžou lišit od obrázku zobrazeného tady.

    • V části Projekt vyberte Projekt Maven.
    • V části Jazyk vyberte Javu.
    • V části Spring Boot vyberte 2.7.11.
    • V části Skupina zadejte artefakt a název stejnou hodnotu pomocí krátkého popisného řetězce. Uživatelské rozhraní může při psaní automaticky vyplnit některá z těchto polí.
    • V podokně Závislosti vyberte Přidat závislosti. Pomocí uživatelského rozhraní můžete přidat závislosti na Spring Web a Spring Security.

    Poznámka:

    Spring Security 5.5.1, 5.4.7, 5.3.10 a 5.2.11 byly vydány, aby vyřešily následující zprávu CVE-2021-22119: Útok DoS s spring-security-oauth2-client. Pokud používáte starší verzi, upgradujte ji.

  3. Vyberte Vygenerovat projekt a pak stáhněte projekt do cesty na místním počítači. Přesuňte stažený soubor do adresáře pojmenovaného po projektu a rozbalte ho. Rozložení souboru by mělo vypadat přibližně takto, s hodnotou, kterou jste zadali pro skupinu místo 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
    

Vytvoření a inicializace instance Microsoft Entra

Vytvoření instance Active Directory

  1. Přihlaste se na adrese https://portal.azure.com.

  2. Vyberte Vytvořit prostředek. Vyhledejte Azure Active Directory B2C.

    Vytvořte novou instanci Azure Active Directory B2C pomocí webu Azure Portal.

  3. Vyberte Vytvořit.

    Položka Azure Marketplace pro Azure Active Directory B2C

  4. Vyberte Vytvořit nového klienta Azure AD B2C.

    Možnost webu Azure Portal pro vytvoření nového tenanta Azure AD B2C

  5. Jako název organizace a počáteční název domény zadejte odpovídající hodnoty a pak vyberte Vytvořit.

    Obrazovka Vytvoření tenanta v Azure AD B2C

  6. Po dokončení vytváření služby Active Directory vyberte svůj účet v pravém horním rohu, vyberte Přepnout adresář a pak vyberte vytvořený adresář. Budete přesměrováni na novou domovskou stránku tenanta. Pak vyhledejte b2c a vyberte Azure AD B2C.

    Vyhledejte službu Azure AD B2C.

Přidání registrace aplikace pro aplikaci Spring Boot

  1. V podokně Správa vyberte Registrace aplikací a pak vyberte Nová registrace.

    Snímek obrazovky webu Azure Portal zobrazující obrazovku Registrace aplikací Azure AD B2C

  2. Do pole Název zadejte název aplikace a pak vyberte Zaregistrovat.

    Azure AD B2C zaregistruje formulář aplikace.

  3. Zpět v podokně Správa vyberte Registrace aplikací a pak vyberte název aplikace, kterou jste vytvořili.

    Registrace aplikací obrazovce s vybraným zobrazovaným názvem.

  4. Vyberte Ověřování a pak přidejte platformu a pak web. Nastavte identifikátory URI přesměrování na http://localhost:8080/login/oauth2/code/a pak vyberte Konfigurovat.

    Možnosti vybrané pro ověřování, přidání platformy, webu

    Nakonfigurujte webovou obrazovku s vybraným polem Identifikátory URI pro přesměrování.

Přidání tajných kódů aplikací pro vaši aplikaci

Vyberte Certifikáty a tajné kódy a pak Nové tajné kódy klienta. Zadejte popis tajného kódu a pak vyberte Přidat. Po vytvoření tajného kódu vyberte ikonu kopírování vedle hodnoty tajného kódu a zkopírujte hodnotu pro pozdější použití v tomto článku.

Přidejte obrazovku tajného klíče klienta.

Obrazovka s certifikáty a tajnými kódy s vybraným tlačítkem kopírovat

Poznámka:

Pokud opustíte oddíl Certifikáty a tajné kódy a vrátíte se, neuvidíte hodnotu tajného kódu. V takovém případě musíte vytvořit další tajný klíč a zkopírovat ho pro budoucí použití. Vygenerovaná hodnota tajného kódu může někdy obsahovat znaky, které jsou problematické pro zahrnutí do souboru application.yml , například zpětné lomítko nebo zpětné lomítko. V takovém případě tento tajný klíč zahoďte a vygenerujte jiný.

Přidání toku uživatele

  1. Přejděte na hlavní stránku tenanta. V části Zásady v levém podokně vyberte Toky uživatelů a pak vyberte Nový tok uživatele.

  2. Teď tento kurz opustíte, spustíte další kurz a až budete hotovi, vraťte se k tomuto kurzu. Tady je několik věcí, které byste měli mít na paměti, když přejdete do jiného kurzu.

    • Začněte krokem, který vás požádá o výběr nového toku uživatele.
    • Pokud tento kurz odkazuje na webapp1hodnotu, kterou jste zadali pro skupinu , použijte místo toho hodnotu.
    • Když vybíráte deklarace identity, které se mají vrátit z toků, ujistěte se, že je vybraný zobrazovaný název . Bez této deklarace identity nebude aplikace vytvořená v tomto kurzu fungovat.
    • Když se zobrazí výzva ke spuštění toků uživatelů, adresa URL pro přesměrování, kterou jste zadali dříve, ještě není aktivní. Toky můžete pořád spouštět, ale přesměrování se úspěšně nedokončí. To se očekává.
    • Až se dostanete na "Další kroky", vraťte se do tohoto kurzu.

    Postupujte podle všech kroků v kurzu: Vytvoření toků uživatelů v Azure Active Directory B2C k vytvoření toků uživatelů pro registraci a přihlášení, úpravy profilu a resetování hesla.

    Azure AD B2C podporuje místní účty i zprostředkovatele sociálních identit. Příklad vytvoření zprostředkovatele identity GitHubu najdete v tématu Nastavení registrace a přihlášení pomocí účtu GitHub pomocí Azure Active Directory B2C.

Konfigurace a kompilace aplikace

Teď, když jste vytvořili instanci Azure AD B2C a některé toky uživatelů, připojíte aplikaci Spring k instanci Azure AD B2C.

  1. Z příkazového řádku přejděte do adresáře, do kterého jste rozbalili soubor .zip, který jste stáhli z Aplikace Spring Initializr.

  2. Přejděte do nadřazené složky projektu a otevřete soubor projektu pom.xml Maven v textovém editoru.

  3. Přidejte do pom.xml závislosti zabezpečení Spring OAuth2:

    <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>
    

    Pro tuto spring-cloud-azure-starter-active-directory-b2cmožnost použijte nejnovější dostupnou verzi. Možná budete moct tuto funkci vyhledat pomocí mvnrepository.com .

    spring-boot-starter-thymeleafPro , použijte verzi odpovídající verzi Spring Boot, kterou jste vybrali výše, například 2.3.4.RELEASE.

    Pokud chcete thymeleaf-extras-springsecurity5, použijte nejnovější dostupnou verzi. Možná budete moct tuto funkci vyhledat pomocí mvnrepository.com . Od tohoto psaní je nejnovější verze 3.0.4.RELEASE.

  4. Uložte a zavřete soubor pom.xml.

    • Spuštěním mvn -DskipTests clean installpříkazu ověřte správnost závislostí. Pokud se vám nezobrazí BUILD SUCCESS, před pokračováním problém vyřešte a vyřešte ho.
  5. Přejděte do složky src/main/resources v projektu a vytvořte soubor application.yml v textovém editoru.

  6. Zadejte nastavení registrace vaší aplikace s použitím dříve vytvořených hodnot. Například:

    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> 
    

    Všimněte si, že client-secret hodnota je uzavřena v jednoduchých uvozovkách. To je nezbytné, protože hodnota <secret-value> bude téměř jistě obsahovat některé znaky, které vyžadují, aby byly uvnitř jednoduchých uvozovek, pokud jsou přítomné v YAML.

    Poznámka:

    Od tohoto zápisu je úplný seznam hodnot integrace spring služby Active Directory B2C, které jsou k dispozici pro použití v application.yml , následující:

    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:
    

    Soubor application.yml je k dispozici v ukázce spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application na GitHubu.

  7. Uložte a zavřete soubor application.yml.

  8. Ve src/main/java/yourGroupId>/yourGroupId/<yourGroupId> vytvořte složku s názvem kontroleru a nahraďte <yourGroupId> hodnotou, kterou jste zadali pro skupinu.<

  9. Ve složce controller vytvořte nový soubor Java WebController.java a otevřete ho v textovém editoru.

  10. Zadejte následující kód, který odpovídajícím způsobem změníte yourGroupId , a pak soubor uložte a zavřete:

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

    Vzhledem k tomu, že každá metoda ve volání initializeModel()kontroleru a tato metoda volá model.addAllAttributes(user.getAttributes());, každá stránka HTML v src/main/resources/templates je schopna získat přístup k některému z těchto atributů, například ${name}, ${grant_type}nebo ${auth_time}. Hodnoty vrácené z user.getAttributes() ověřování jsou ve skutečnosti deklarace identity id_token ověřování. Úplný seznam dostupných deklarací identity je uvedený v tokenech ID platformy Microsoft Identity Platform.

  11. Vytvořte složku s názvem security in src/main/java/<yourGroupId>/<yourGroupId> a nahraďte yourGroupId hodnotou, kterou jste zadali pro skupinu.

  12. Ve složce security vytvořte nový soubor Java WebSecurityConfigation.java a otevřete ho v textovém editoru.

  13. Zadejte následující kód, který odpovídajícím způsobem změníte yourGroupId , a pak soubor uložte a zavřete:

    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. Zkopírujte soubor home.html z ukázky spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application do src/main/resources/templates a nahraďte ${your-profile-edit-user-flow} názvy ${your-password-reset-user-flow} toků uživatelů, které jste vytvořili dříve.

Sestavení a otestování aplikace

  1. Otevřete příkazový řádek a přejděte do složky, ve které se nachází soubor pom.xml vaší aplikace.

  2. Sestavte aplikaci Spring Boot pomocí Mavenu a spusťte ji. Například:

    Poznámka:

    Je velmi důležité, aby čas podle systémových hodin, pod kterými běží místní aplikace Spring Boot, byla přesná. Při použití OAuth 2.0 je velmi malá tolerance nerovnoměrné distribuce hodin. I tři minuty nepřesnosti mohou způsobit selhání přihlášení s chybou podobnou [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. Od tohoto psaní má time.gov indikátor, jak daleko je vaše hodiny od skutečného času. Aplikace byla úspěšně spuštěna se nerovnoměrnou distribuci +0,019 sekund.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. Po sestavení a spuštění aplikace pomocí Mavenu ve webovém prohlížeči přejděte na adresu http://localhost:8080/. Měli byste být přesměrováni na přihlašovací stránku.

    Přihlašovací stránka webové aplikace

  4. Vyberte odkaz s textem souvisejícím s přihlášením. Měli byste být přesměrováni na Azure AD B2C a zahájit proces ověřování.

  5. Po úspěšném přihlášení byste měli vidět ukázku home page z prohlížeče.

    Úspěšné přihlášení webové aplikace

Řešení problému

Následující části popisují, jak vyřešit některé problémy, se kterými se můžete setkat.

Chybějící název atributu v atributech

Při spuštění ukázky se může zobrazit výjimka se zprávou Missing attribute 'name' in attributes. Protokol pro tuto výjimku bude vypadat podobně jako následující výstup:

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]

Pokud se zobrazí tato chyba, pečlivě zkontrolujte pracovní postup uživatele, který jste vytvořili v kurzu: Vytvoření toků uživatelů v Azure Active Directory B2C. Při vytváření uživatelského pracovního postupu pro atributy a deklarace identity uživatele nezapomeňte zvolit atributy a deklarace identity pro zobrazovaný název. Nezapomeňte také správně nakonfigurovat user-name-attribute-name v souboru application.yml .

Přihlášení pomocí smyček ke koncovému bodu B2C

Příčinou tohoto problému je pravděpodobně znečisťované soubory cookie pro localhost. Vyčistěte soubory cookie localhost a zkuste to znovu.

Shrnutí

V tomto kurzu jste vytvořili novou webovou aplikaci v Javě pomocí úvodní sady Azure Active Directory B2C, nakonfigurovali jste nového tenanta Azure AD B2C a zaregistrovali jste v něm novou aplikaci a pak jste aplikaci nakonfigurovali tak, aby používala poznámky a třídy Spring k ochraně webové aplikace.

Vyčištění prostředků

Až už je nebudete potřebovat, odstraňte na webu Azure Portal prostředky vytvořené v tomto článku, aby se vám neúčtovaly poplatky.

Další kroky

Pokud se chcete dozvědět více o architektuře Spring a Azure, přejděte do centra dokumentace Spring v Azure.