Sdílet prostřednictvím


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í Spring Initializr pomocí úvodní sady Spring Boot pro ID Microsoft Entra.

V tomto kurzu se naučíte:

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

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

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 Projectvyberte Maven projekt.
    • V části Language(Jazyk) vyberte Java.
    • V části Spring Bootvyberte 2.7.11.
    • V části Group, Artifact a Name zadejte 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 řešily následující zprávu CVE CVE-2021-22119: útok odmítnutí služby s komponentou spring-security-oauth2-client. Pokud používáte starší verzi, upgradujte ji.

  3. Vyberte Vygenerovat projekta poté stáhněte projekt do zadané složky 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 Group 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 služby Active Directory

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

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

    vytvořit novou instanci Azure Active Directory B2C pomocí webu Azure Portal.

  3. Vyberte Vytvořit.

    záznam v Azure Marketplace pro Azure Active Directory B2C.

  4. Vyberte Vytvořit nové předplatné Azure AD B2C.

    možnost portálu Azure vytvořit nového nájemce Azure AD B2C.

  5. V název organizace a počáteční název doményzadejte příslušné hodnoty a pak vyberte Vytvořit.

    na obrazovce vytvoření tenanta Azure AD B2C

  6. Po dokončení vytváření služby Active Directory vyberte svůj účet v pravém horním rohu, vyberte možnost Přepnout adresářa poté zvolte 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 pro vaši aplikaci Spring Boot

  1. V podokně Spravovat vyberte Registrace aplikacía poté 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 své aplikace a poté vyberte Zaregistrovat.

    Azure AD B2C zaregistrujte formulář aplikace.

  3. Zpět v podokně Spravovat vyberte Registrace aplikacía pak vyberte název vámi vytvořené aplikace.

    obrazovka registrace aplikací s vybraným zobrazovaným názvem.

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

    Možnosti vybrané pro ověřování, přidejte platformu, web.

    Konfigurujte webovou obrazovku s vybraným polem 'Přesměrovat URI'

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

Vyberte Certifikáty & tajemství, pak Nové klientské tajemství. Zadejte popis tajného kódu a 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řidání tajné obrazovky klienta

obrazovka Certifikáty a tajné kódy s vybraným tlačítkem pro kopírování

Poznámka

Pokud opustíte oddíl Certifikáty & tajných kódů a vrátíte se, nebudete moct zobrazit 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ý apostrof. V takovém případě tento tajný klíč zahoďte a vygenerujte jiný.

Přidání uživatelského toku

  1. Přejděte na hlavní stránku tenanta. V části „Zásady“ v levém podokně vyberte „Toky uživatelů“ a poté 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 toku nového uživatele.
    • Pokud se tento kurz týká webapp1, použijte místo toho hodnotu, kterou jste zadali pro Group.
    • Když vybíráte položky, které se mají vrátit z toků, ujistěte se, že je vybrán 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čí. Očekává se to.
    • Až se dostanete na "Další kroky", vraťte se do tohoto kurzu.

    Postupujte podle všech kroků v kurzu : Vytváření toků uživatelů v Azure Active Directory B2C vytvář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 GitHub najdete viz 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 pomocí příkazu `cd`, do kterého jste rozbalili soubor .zip, který jste stáhli ze 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.xmlzá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 spring-cloud-azure-starter-active-directory-b2cpoužijte nejnovější dostupnou verzi. Možná budete moct toto vyhledat pomocí mvnrepository.com.

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

    Pro thymeleaf-extras-springsecurity5použijte nejnovější dostupnou verzi. Možná budete moct použít mvnrepository.com k ověření tohoto. K dnešnímu dni je nejnovější verze 3.0.4.RELEASE.

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

    • Spuštěním mvn -DskipTests clean installověřte správnost závislostí. Pokud nevidíte BUILD SUCCESS, odstraňte problém předtím, než budete pokračovat.
  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 aplikace pomocí hodnot, které jste vytvořili dříve; 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 hodnota client-secret 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 v jednoduchých uvozovkách, pokud jsou přítomné v YAML.

    Poznámka

    K datu tohoto zápisu je úplný seznam hodnot Spring Integrace 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>vytvořte složku s názvem controller , přičemž <yourGroupId> nahraďte hodnotou, kterou jste zadali pro Group.

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

  10. Zadejte následující kód, odpovídajícím způsobem změň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 v kontroleru volá initializeModel()a tato metoda volá model.addAllAttributes(user.getAttributes());, všechny stránky HTML v src/main/resources/templates mají přístup k některým z těchto atributů, jako jsou ${name}, ${grant_type}nebo ${auth_time}. Hodnoty vrácené z user.getAttributes() jsou ve skutečnosti nároky id_token pro účely ověřování. Úplný seznam dostupných nároků je uvedený v ID tokenech platformy Microsoft.

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

  12. Ve složce zabezpečení vytvořte nový soubor Java s názvem WebSecurityConfiguration.java a otevřete ho v textovém editoru.

  13. Zadejte následující kód, odpovídajícím způsobem změň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/templatesa nahraďte ${your-profile-edit-user-flow} a ${your-password-reset-user-flow} názvy toků uživatelů, které jste vytvořili dříve.

Sestavení a otestování aplikace

  1. Otevřete příkazový řádek a změňte adresář 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, byl přesný. Při použití OAuth 2.0 je velmi malá tolerance nerovnoměrné distribuce hodin. Již 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. V době psaní tohoto textu time.gov ukazuje, jak moc se vaše hodiny liší od skutečného času. Aplikace byla úspěšně spuštěna s posunem o +0,019 sekundy.

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

    přihlašovací stránku 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í by se měl zobrazit ukázkový příklad home page z prohlížeče.

    úspěšné přihlášení k webové aplikaci.

Řešení problémů

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: Vytváření toků uživatelů v azure Active Directory B2C. Při vytváření uživatelského pracovního postupu, pro Atributy uživatele a deklarace identity, 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 pro 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.

Uvolnění prostředků

Pokud už je nepotřebujete, pomocí webu Azure Portal odstraňte prostředky vytvořené v tomto článku, abyste se vyhnuli neočekávaným poplatkům.

Další kroky

Další informace o Springu a Azure najdete v centru dokumentace Spring on Azure.