Partilhar via


Adicionar início de sessão com o Azure Ative Directory B2C a uma aplicação Web Spring

Este artigo mostra como criar um aplicativo Java com capacidade de entrada usando Spring Initializr com o Spring Boot Starter para Microsoft Entra ID.

Neste tutorial, você aprenderá a:

  • Criar um aplicativo Java usando o Spring Initializr
  • Configurar o Azure Active Directory B2C
  • Proteja o aplicativo com classes e anotações do Spring Boot
  • Construa e teste sua aplicação Java

Microsoft Entra ID é a solução de identidade empresarial em escala de nuvem da Microsoft. Azure Ative Directory B2C complementa o conjunto de recursos do Microsoft Entra ID, permitindo que você gerencie o acesso de clientes, consumidores e cidadãos aos seus aplicativos B2C (business-to-consumer).

Pré-requisitos

  • Uma assinatura do Azure. Se ainda não tiver uma, crie uma conta gratuita antes de começar.
  • Um Java Development Kit (JDK) suportado. Para obter mais informações sobre os JDKs disponíveis para uso ao desenvolver no Azure, consulte suporte Java no Azure e Azure Stack.
  • Apache Maven, versão 3.0 ou superior.

Importante

O Spring Boot versão 2.5 ou superior é necessário para concluir as etapas neste artigo.

Criar um aplicativo usando o Spring Initializr

  1. Navegue até https://start.spring.io/.

  2. Preencha os valores de acordo com esta orientação. Os rótulos e o layout podem diferir da imagem mostrada aqui.

    • Em Project, selecione Maven Project.
    • Em Language, selecione Java.
    • Em Spring Boot, selecione 2.7.11.
    • Em Grupo, Artefato e Nome, insira o mesmo valor, usando uma string descritiva curta. A interface do usuário pode preencher automaticamente alguns desses campos à medida que você digita.
    • No painel de Dependências, selecioneAdicionar Dependências . Use a interface de utilizador para adicionar dependências para Spring Web e Spring Security.

    Observação

    Spring Security 5.5.1, 5.4.7, 5.3.10 e 5.2.11 foram lançados para tratar o seguinte relatório CVE CVE-2021-22119: Ataque de negação de serviço com spring-security-oauth2-client. Se você estiver usando a versão mais antiga, atualize-a.

  3. Selecione Gerar projetoe, em seguida, transfira o projeto para um caminho no computador local. Mova o arquivo baixado para um diretório com o nome do seu projeto e descompacte o arquivo. O layout do arquivo deve ser semelhante ao seguinte, com o valor inserido para Grupo no lugar de 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
    

Criar e inicializar uma instância do Microsoft Entra

Criar a instância do Ative Directory

  1. Faça login em https://portal.azure.com.

  2. Selecione Criar um recurso. Pesquisar Azure Active Directory B2C.

    Crie uma nova instância B2C do Azure Ative Directory usando o portal do Azure.

  3. Selecione Criar.

    entrada do Azure Marketplace para o Azure Active Directory B2C.

  4. Selecione Criar um novo locatário do Azure AD B2C.

    opção do portal do Azure para criar um novo locatário do Azure AD B2C.

  5. Para nome da organização e nome de domínio inicial, forneça os valores apropriados e selecione Criar.

    Ecrã Criar Locatário do Azure AD B2C.

  6. Quando a criação do Ative Directory estiver concluída, selecione sua conta no canto superior direito, selecione Alternar diretórioe, em seguida, selecione o diretório criado. Você será redirecionado para a página inicial do novo locatário. Em seguida, procure b2c e selecione Azure AD B2C.

    Localize o serviço Azure AD B2C.

Adicionar um registro de aplicativo para seu aplicativo Spring Boot

  1. No painel Gerir, selecione Registos de aplicaçõese, em seguida, selecione Novo registo.

    Captura de ecrã do portal do Azure a mostrar o ecrã de registos da Aplicação Azure AD B2C.

  2. No campo Nome, introduza o nome da sua app e, depois, selecione Registar.

    Azure AD B2C registrar um formulário de inscrição.

  3. De volta ao painel Gerir, selecione Registos de aplicaçõese, em seguida, selecione o nome da aplicação que criou.

    Ecrã de registos de aplicações com o nome de apresentação selecionado.

  4. Selecione Autenticação, depois Adicionar uma plataforma, depois Web. Defina o Redirecionar URIs como e, em seguida, selecione Configurar.

    Opções selecionadas para autenticação, adicione uma plataforma, web.

    Configurar tela da Web com o campo Redirecionar URIs selecionado.

Adicionar segredos de aplicativo para seu aplicativo

Selecione Certificados & segredos, depois Segredos de cliente novos. Introduza a descrição secreta e, em seguida, selecione Adicionar. Depois de criar o segredo, selecione o ícone de cópia ao lado do valor secreto para copiar o valor para uso posterior neste artigo.

Adicionar uma tela secreta do cliente.

tela de Certificados e segredos com o botão de cópia selecionado.

Observação

Se você deixar a seção Certificados & segredos e voltar, não poderá ver o valor secreto. Nesse caso, você deve criar outro segredo e copiá-lo para uso futuro. Ocasionalmente, o valor secreto gerado pode conter caracteres que são problemáticos para inclusão no ficheiro application.yml, como barra invertida ou acento grave. Nesse caso, descarte esse segredo e gere outro.

Adicionar fluxo de usuário

  1. Navegue até a página principal do locatário. Na seção Políticas do painel esquerdo, selecione Fluxos de Utilizadore, em seguida, selecione Novo Fluxo de Utilizador.

  2. Agora você sairá deste tutorial, executará outro tutorial e voltará a este tutorial quando terminar. Aqui estão algumas coisas para ter em mente quando você vai para o outro tutorial.

    • Comece com a etapa que solicita que selecione Fluxo de Novo Utilizador.
    • Quando este tutorial se referir a webapp1, em vez disso, use o valor que inseriu para o Grupo .
    • Ao selecionar as declarações a serem retornadas dos fluxos, verifique se Nome para Exibição está selecionado. Sem essa afirmação, o aplicativo que está sendo criado neste tutorial não funcionará.
    • Quando você é solicitado a executar os fluxos de usuário, a URL de redirecionamento especificada anteriormente ainda não está ativa. Você ainda pode executar os fluxos, mas o redirecionamento não será concluído com êxito. Isso é esperado.
    • Quando chegar a "Próximos passos", volte a este tutorial.

    Siga todas as etapas em Tutorial: Criar fluxos de usuário no Azure Ative Directory B2C criar fluxos de usuário para "inscrição e entrada", "edição de perfil" e "redefinição de senha".

    O Azure AD B2C dá suporte a contas locais, bem como provedores de identidade social. Para obter um exemplo de criação de um provedor de identidade GitHub, consulte Configurar inscrição e entrada com uma conta do GitHub usando o Azure Ative Directory B2C.

Configurar e compilar seu aplicativo

Agora que você criou a instância do Azure AD B2C e alguns fluxos de usuário, conectará seu aplicativo Spring à instância do Azure AD B2C.

  1. A partir da linha de comando, cd para o diretório onde você descompactou o arquivo .zip que você baixou do Spring Initializr.

  2. Navegue até a pasta pai do seu projeto e abra o arquivo de projeto pom.xml Maven em um editor de texto.

  3. Adicione as dependências de segurança do Spring OAuth2 ao 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>
    

    Para o spring-cloud-azure-starter-active-directory-b2c, use a versão mais recente disponível. Você pode ser capaz de usar mvnrepository.com para procurar isso.

    Para o spring-boot-starter-thymeleaf, use a versão correspondente à versão do Spring Boot que você selecionou acima, por exemplo, 2.3.4.RELEASE.

    Para thymeleaf-extras-springsecurity5, use a versão mais recente disponível. Você pode ser capaz de usar mvnrepository.com para procurar isso. No momento em que este artigo foi escrito, a versão mais recente é 3.0.4.RELEASE.

  4. Salve e feche o arquivo pom.xml.

    • Verifique se suas dependências estão corretas executando mvn -DskipTests clean install. Se não vir BUILD SUCCESS, identifique e resolva o problema antes de continuar.
  5. Navegue até a pasta src/main/resources em seu projeto e crie um arquivo application.yml em um editor de texto.

  6. Especifique as configurações para o registro do seu aplicativo usando os valores criados anteriormente; Por exemplo:

    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> 
    

    Observe que o valor client-secret está entre aspas simples. Isso é necessário porque o valor de <secret-value> quase certamente conterá alguns caracteres que exigem estar dentro de aspas simples quando presentes no YAML.

    Observação

    No momento em que este artigo foi escrito, a lista completa de valores do Ative Directory B2C Spring Integration que estão disponíveis para uso no application.yml é a seguinte:

    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:
    

    O ficheiro application.yml está disponível no exemplo de spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application no GitHub.

  7. Salve e feche o arquivo application.yml.

  8. Crie uma pasta chamada controlador em src/main/java/<yourGroupId>/<yourGroupId>, substituindo <yourGroupId> pelo valor que você inseriu para Grupo.

  9. Crie um novo arquivo Java chamado WebController.java na pasta do controlador e abra-o em um editor de texto.

  10. Digite o seguinte código, alterando yourGroupId apropriadamente, salve e feche o arquivo:

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

    Como cada método no controlador chama initializeModel(), e esse método chama model.addAllAttributes(user.getAttributes());, qualquer página HTML em src/main/resources/templates é capaz de acessar qualquer um desses atributos, como ${name}, ${grant_type}ou ${auth_time}. Os valores retornados de user.getAttributes() são, na verdade, as reivindicações do id_token para a autenticação. A lista completa de declarações disponíveis está listada em tokens de ID da plataforma de identidade da Microsoft.

  11. Crie uma pasta chamada de segurança em src/main/java/<yourGroupId>/<yourGroupId>, substituindo yourGroupId pelo valor que você inseriu para Grupo.

  12. Crie um novo arquivo Java chamado WebSecurityConfiguration.java na pasta security e abra-o em um editor de texto.

  13. Digite o seguinte código, alterando yourGroupId apropriadamente, salve e feche o arquivo:

    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. Copie o arquivo home.html de exemplo spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application para src/main/resources/templatese substitua o ${your-profile-edit-user-flow} e o ${your-password-reset-user-flow} pelos nomes dos fluxos de usuário criados anteriormente.

Crie e teste seu aplicativo

  1. Abra um prompt de comando e altere o diretório para a pasta onde o arquivo pom.xml do seu aplicativo está localizado.

  2. Construa seu aplicativo Spring Boot com o Maven e execute-o; Por exemplo:

    Observação

    É extremamente importante que a hora de acordo com o relógio do sistema sob a qual a aplicação Spring Boot local é executada seja precisa. Há muito pouca tolerância de distorção de relógio ao usar OAuth 2.0. Mesmo três minutos de imprecisão podem fazer com que o login falhe com um erro semelhante ao [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. No momento em que este artigo foi escrito, time.gov tem um indicador de quão desfasado o seu relógio está em relação à hora real. O aplicativo foi executado com sucesso com uma inclinação de +0,019 segundos.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. Depois que seu aplicativo for criado e iniciado pelo Maven, abra http://localhost:8080/ em um navegador da web; Você deve ser redirecionado para a página de login.

    página de login do aplicativo Web.

  4. Selecione o link com o texto relacionado ao login. Você deve ser redirecionado para o Azure AD B2C para iniciar o processo de autenticação.

  5. Depois de iniciar sessão com êxito, deverá ver a amostra home page no navegador.

    login bem-sucedido do aplicativo Web.

Solução de problemas

As seções a seguir descrevem como resolver alguns problemas que você pode encontrar.

Nome do atributo ausente nos atributos

Ao executar o exemplo, você pode obter uma exceção com a mensagem Missing attribute 'name' in attributes. O log desta exceção será parecido com a saída seguinte:

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]

Se você receber esse erro, verifique novamente o fluxo de trabalho de usuário criado em Tutorial: Criar fluxos de usuário no Azure Ative Directory B2C. Ao criar o fluxo de trabalho do utilizador, para os atributos e declarações do usuário , certifique-se de escolher atributos e declarações para Nome de Exibição. Além disso, certifique-se de configurar corretamente user-name-attribute-name no arquivo application.yml.

Iniciar sessão com loops no endpoint B2C

Este problema é provavelmente devido a cookies poluídos para localhost. Limpe os cookies para localhost e tente novamente.

Resumo

Neste tutorial, você criou um novo aplicativo Web Java usando o iniciador B2C do Azure Ative Directory, configurou um novo locatário do Azure AD B2C e registrou um novo aplicativo nele e, em seguida, configurou seu aplicativo para usar as anotações e classes Spring para proteger o aplicativo Web.

Limpar recursos

Quando não for mais necessário, use o do portal do Azure para excluir os recursos criados neste artigo para evitar cobranças inesperadas.

Próximos passos

Para saber mais sobre o Spring e o Azure, continue para o centro de documentação do Spring on Azure.