Habilitar a entrada para aplicativos Java JBoss EAP por meio do MSAL4J com o Azure Active Directory B2C
Este artigo apresenta um aplicativo Java JBoss EAP que autentica usuários no Azure Active Directory B2C (Azure AD B2C) usando a Biblioteca de Autenticação da Microsoft para Java (MSAL4J).
O diagrama a seguir mostra a topologia do aplicativo:
O aplicativo usa o MSAL4J para conectar usuários e obter um token de ID do Azure AD B2C. O token de ID prova que o usuário está autenticado em um locatário do Azure AD B2C.
Pré-requisitos
- JDK versão 8 ou superior
- Maven 3
- Um locatário do Azure AD B2C. Para obter mais informações, consulte Tutorial: Criar um locatário do Azure Active Directory B2C
- Uma conta de usuário no seu locatário do Azure AD B2C.
Recomendações
- Alguma familiaridade com o Java/Jakarta Servlets.
- Alguma familiaridade com o terminal Linux/OSX.
- jwt.ms para inspecionar seus tokens.
- Fiddler para monitorar sua atividade de rede e solução de problemas.
- Siga o Blog do Microsoft Entra ID para se atualizar com os desenvolvimentos mais recentes.
Configurar o exemplo
As seções a seguir mostram como configurar o aplicativo de exemplo.
Clone ou baixe o repositório de exemplo.
Para clonar o exemplo, abra uma janela do Bash e use o seguinte comando:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/1-Authentication/sign-in-b2c
Como alternativa, navegue até o repositório ms-identity-msal-java-samples, baixe-o como um arquivo .zip e extraia-o para o disco rígido.
Importante
Para evitar limitações de comprimento de caminho de arquivo no Windows, clone ou extraia o repositório em um diretório próximo à raiz do disco rígido.
Registrar o aplicativo de exemplo com seu locatário do Azure AD B2C
O exemplo vem com um aplicativo pré-registrado para testes. Se quiser usar seu próprio locatário e aplicativo Azure AD B2C, siga as etapas nas seções a seguir para registrar e configurar o aplicativo no portal do Azure. Caso contrário, continue com as etapas para Executar o exemplo.
Escolha o locatário do Azure AD B2C no qual você deseja criar seus aplicativos
Siga as etapas a seguir para escolher o locatário:
Entre no portal do Azure.
Se sua conta estiver presente em mais de um locatário do Azure AD B2C, selecione o perfil no canto do portal do Azure e selecione Mudar diretório para alterar sua sessão para o locatário do Azure AD B2C desejado.
Criar fluxos dos usuários e políticas personalizadas
Para criar fluxos de usuário comuns, como inscrição, entrada, edição de perfil e redefinição de senha, consulte Tutorial: Criar fluxos do usuário no Azure Active Directory B2C.
Você também deve considerar a criação de Políticas personalizadas no Azure Active Directory B2C, no entanto, isso está além do escopo deste tutorial.
Adicionar provedores de identidade externos
Consulte Tutorial: Adicionar provedores de identidade a seus aplicativos no Azure Active Directory B2C.
Registrar o aplicativo (ms-identity-b2c-java-servlet-webapp-authentication)
Para registrar o aplicativo, use estas etapas:
Navegue até o portal do Azure e selecione Azure AD B2C.
Selecione Registros de aplicativo no painel de navegação e selecione Novo registro.
Na página Registrar um aplicativo que aparece, insira as seguintes informações de registro do aplicativo:
- Na seção Nome, insira um nome de aplicativo relevante para exibição aos usuários do aplicativo: por exemplo,
ms-identity-b2c-java-servlet-webapp-authentication
. - Nos Tipos de conta com suporte, selecione Contas em qualquer diretório organizacional e contas pessoais da Microsoft (por exemplo, Skype, Xbox, Outlook.com) .
- Na seção URI de redirecionamento (opcional), selecione Web na caixa de combinação e insira o seguinte URI de redirecionamento:
http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_redirect
.
- Na seção Nome, insira um nome de aplicativo relevante para exibição aos usuários do aplicativo: por exemplo,
Selecione Registrar para criar o aplicativo.
Na página de registro do aplicativo, localize e copie o valor do ID do aplicativo (cliente) para uso posterior. Use esse valor no(s) arquivo(s) de configuração do aplicativo.
Selecione Salvar para salvar as alterações.
Na página de registo do aplicativo, selecione Segredos de certificados & no painel de navegação para abrir a página em que possa gerar segredos e carregar certificados.
Na seção Segredos do Cliente, escolha Novo Segredo do Cliente.
Insira uma descrição, por exemplo, segredo do aplicativo.
Selecione uma das durações disponíveis: Em 1 ano, Em 2 anos ou Nunca expira.
Selecione Adicionar. O valor gerado é exibido.
Copie e salve o valor gerado para uso nas etapas posteriores. Esse valor é necessário para os arquivos de configuração do código. Esse valor não é exibido novamente e você não pode recuperá-lo por outros meios. Portanto, salve-o no portal do Azure antes de navegar para qualquer outra tela ou painel.
Configurar o aplicativo (ms-identity-b2c-java-servlet-webapp-authentication) para usar o registro do aplicativo
Use as seguintes etapas para configurar o aplicativo:
Observação
Nas etapas a seguir, ClientID
é o mesmo que Application ID
ou AppId
.
Abrir o projeto no seu IDE.
Abra o arquivo ./src/main/resources/authentication.properties.
Localize a propriedade
aad.clientId
e substitua o valor existente pelo ID do aplicativo ouclientId
do aplicativoms-identity-b2c-java-servlet-webapp-authentication
do portal do Azure.Localize a propriedade
aad.secret
e substitua o valor existente pelo valor que você salvou durante a criação do aplicativoms-identity-b2c-java-servlet-webapp-authentication
do portal do Azure.Localize a propriedade
aad.scopes
e substitua o clientId do aplicativo existente pelo valor que você colocouaad.clientId
na etapa 1 desta seção.Localize a propriedade
aad.authority
e substitua a primeira instância defabrikamb2c
pelo nome do locatário do Azure AD B2C no qual você criou o aplicativoms-identity-b2c-java-servlet-webapp-authentication
no portal do Azure.Localize a propriedade
aad.authority
e substitua a segunda instância defabrikamb2c
pelo nome do locatário do Azure AD B2C no qual você criou o aplicativoms-identity-b2c-java-servlet-webapp-authentication
no portal do Azure.Localize a propriedade
aad.signInPolicy
e substitua-a pelo nome da política de fluxo de usuário de inscrição/entrada que você criou no locatário do Azure AD B2C no qual você criou o aplicativoms-identity-b2c-java-servlet-webapp-authentication
no portal do Azure.Localize a propriedade
aad.passwordResetPolicy
e substitua-a pelo nome da política de fluxo de usuário de redefinição de senha que você criou no locatário do Azure AD B2C no qual você criou o aplicativoms-identity-b2c-java-servlet-webapp-authentication
no portal do Azure.Localize a propriedade
aad.editProfilePolicy
e substitua-a pelo nome da política de fluxo de usuário do perfil de edição que você criou no locatário do Azure AD B2C no qual você criou o aplicativoms-identity-b2c-java-servlet-webapp-authentication
no portal do Azure.
Compilar o exemplo
Para criar o exemplo usando o Maven, navegue até o diretório que contém o arquivo pom.xml do exemplo e execute o seguinte comando:
mvn clean package
Esse comando gera um arquivo .war que pode ser executado em vários servidores de aplicativos.
Execute o exemplo
As seções a seguir mostram como implantar o exemplo no Serviço de Aplicativo do Azure.
Pré-requisitos
Plug-in do Maven para aplicativos do Serviço de Aplicativo do Azure
Se o Maven não for sua ferramenta de desenvolvimento preferida, confira os seguintes tutoriais semelhantes que usam outras ferramentas:
Configurar o plug-in do Maven
O processo de implantação no Serviço de Aplicativo do Azure usa suas credenciais do Azure a partir da CLI do Azure automaticamente. Se a CLI do Azure não estiver instalada localmente, o plugin Maven será autenticado com o OAuth ou com as credenciais do dispositivo. Para obter mais informações, confira autenticação com plug-ins do Maven.
Use as etapas a seguir para configurar o plug-in:
Execute o comando Maven mostrado ao lado para configurar a implantação. Esse comando ajuda você a configurar o sistema operacional do Serviço de Aplicativo, a versão Java e a versão do Tomcat.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config
Para Criar uma nova configuração de execução, pressione Y e depois pressione Enter.
Em Definir valor para SO, pressione 2 para Linux e depois pressione Enter.
Em Definir valor para javaVersion, pressione 2 para Java 11 e depois pressione Enter.
Em Definir valor para webContainer, pressione 1 para JBosseap7 e depois pressione Enter.
Em Definir valor para pricingTier, pressione Enter para selecionar o nível P1v3 padrão.
Para Confirmar, pressione Y e depois pressione Enter.
O exemplo a seguir mostra a saída do processo de implantação:
Please confirm webapp properties
AppName : msal4j-servlet-auth-1707220080695
ResourceGroup : msal4j-servlet-auth-1707220080695-rg
Region : centralus
PricingTier : P1v3
OS : Linux
Java Version: Java 11
Web server stack: JBosseap 7
Deploy to slot : false
Confirm (Y/N) [Y]:
[INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26.196 s
[INFO] Finished at: 2024-02-06T11:48:16Z
[INFO] ------------------------------------------------------------------------
Depois de confirmar as suas escolhas, o plug-in adiciona a configuração do plug-in e as configurações necessárias ao arquivo pom.xml do projeto para configurar o aplicativo para ser executado no Serviço de aplicativo do Azure.
A parte relevante do arquivo pom.xml deve ser semelhante ao exemplo a seguir:
<build>
<plugins>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>>azure-webapp-maven-plugin</artifactId>
<version>x.xx.x</version>
<configuration>
<schemaVersion>v2</schemaVersion>
<resourceGroup>your-resourcegroup-name</resourceGroup>
<appName>your-app-name</appName>
...
</configuration>
</plugin>
</plugins>
</build>
Você poderá modificar as configurações do Serviço de Aplicativo diretamente em seu pom.xml. Algumas configurações comuns são listadas na tabela a seguir:
Propriedade | Obrigatório | Descrição | Versão |
---|---|---|---|
schemaVersion |
false | A versão do esquema de configuração. Os valores com suporte são v1 e v2 . |
1.5.2 |
subscriptionId |
false | A ID da assinatura. | 0.1.0+ |
resourceGroup |
true | O grupo de recursos do Azure para seu aplicativo. | 0.1.0+ |
appName |
true | O nome do seu aplicativo. | 0.1.0+ |
region |
false | A região na qual hospedar seu aplicativo. O valor padrão é centralus . Para regiões válidas, consulte Regiões com suporte. |
0.1.0+ |
pricingTier |
false | O nível de preços do seu aplicativo. O valor padrão é P1v2 para uma carga de trabalho de produção. O valor mínimo recomendado para desenvolvimento e teste Java é B2 . Para saber mais, veja Preços do Serviço de Aplicativo |
0.1.0+ |
runtime |
false | A configuração do ambiente de tempo de execução. Para mais informações, confira Informações de configuração. | 0.1.0+ |
deployment |
false | Configuração de implantação. Para mais informações, confira Informações de configuração. | 0.1.0+ |
Para obter a lista completa de configurações, veja a documentação de referência do plug-in. Todos os plug-ins do Azure Maven compartilham um conjunto comum de configurações. Para essas configurações, consulte Configurações comuns. Para conhecer as configurações específicas do Serviço de Aplicativo do Azure, consulte Aplicativo do Azure: Detalhes da configuração.
Salve os valores appName
e resourceGroup
para uso posterior.
Preparar o aplicativo para implantação
Quando você implanta seu aplicativo no Serviço de Aplicativo, o URL de redirecionamento é alterado para o URL de redirecionamento da instância do aplicativo implantado. Use as etapas a seguir para alterar essas configurações em seu arquivo de propriedades:
Navegue até o arquivo authentication.properties do seu aplicativo e altere o valor de
app.homePage
para o nome de domínio do aplicativo implantado, conforme mostrado no exemplo a seguir. Por exemplo, se escolheuexample-domain
o nome do aplicativo na etapa anterior, agora deve usarhttps://example-domain.azurewebsites.net
para oapp.homePage
valor. Altere também o protocolo dehttp
parahttps
.# 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://<your-app-name>.azurewebsites.net
Depois de salvar esse arquivo, use o seguinte comando para recompilar o aplicativo:
mvn clean package
Importante
Neste mesmo arquivo authentication.properties, você tem uma configuração para o aad.secret
. Não é uma prática recomendada implantar esse valor no Serviço de Aplicativo. Também não é uma prática recomendada deixar esse valor no código e possivelmente enviá-lo para o repositório git. Para remover esse valor secreto do seu código, você pode encontrar orientações mais detalhadas na seção Implantar no Serviço de Aplicativo – Remover segredo. Essas diretrizes adicionam etapas extras para enviar o valor secreto por push para Key Vault e usar as Referências do Key Vault.
Atualizar seu registro de aplicativo do Microsoft Entra ID
Como o URI de redirecionamento é alterado para o aplicativo implantado no Serviço de Aplicativo do Azure, você também precisa alterar o URI de redirecionamento no registro do aplicativo Microsoft Entra ID. Use as seguintes etapas para fazer essa alteração:
Navegue até a página de registros de aplicativo da plataforma de identidade da Microsoft para desenvolvedores.
Use a caixa de pesquisa para procurar o registro do aplicativo. Por exemplo,
java-servlet-webapp-authentication
.Abra o registro do aplicativo selecionando seu nome.
Selecione Autenticação no menu.
Na seção Web - URIs de redirecionamento, selecione Adicionar URI.
Preencha o URI do aplicativo, anexando
/auth/redirect
, por exemplo,https://<your-app-name>.azurewebsites.net/auth/redirect
.Selecione Salvar.
Implantar o aplicativo
Agora você está pronto para implantar o aplicativo no Serviço de Aplicativo do Azure. Use o seguinte comando para verificar se você está conectado ao ambiente do Azure para executar a implantação:
az login
Com todas as configurações prontas no arquivo pom.xml, agora você pode usar o seguinte comando para implantar o aplicativo Java no Azure:
mvn package azure-webapp:deploy
Após a conclusão da implementação, seu aplicativo estará pronto em http://<your-app-name>.azurewebsites.net/
. Abra o URL com o seu navegador da Web local, onde deverá ver a página inicial do aplicativo msal4j-servlet-auth
.
Explorar o exemplo
Use as seguintes etapas para explorar o exemplo:
- Observe o status de conectado ou desconectado exibido no centro da tela.
- Selecione o botão contextual no canto. Esse botão lê Entrar quando você executa o aplicativo pela primeira vez.
- Na próxima página, siga as instruções e conecte-se com uma conta do provedor de identidade escolhido.
- Observe que o botão contextual agora diz Sair e exibe seu nome de usuário.
- Selecione Detalhes do Token de ID para ver algumas das declarações decodificadas do token de ID.
- Você também tem a opção de editar seu perfil. Selecionar o link para editar detalhes como o nome de exibição, local de residência e profissão.
- Use o botão no canto para desconectar.
- Depois de desconectar, navegue até a seguinte URL para a página de detalhes do token:
http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_token_details
. Aqui, você pode observar como o aplicativo exibe um erro401: unauthorized
em vez das declarações de token de ID.
Observações sobre o código
Este exemplo apresenta como usar o MSAL4J para conectar usuários ao locatário do Azure AD B2C.
Contents
A tabela a seguir mostra o conteúdo da pasta do projeto de exemplo:
Arquivo/pasta | Descrição |
---|---|
AuthHelper.java | Funções auxiliares para autenticação. |
Config.java | É executado na inicialização e configura o leitor e o registrador de propriedades. |
authentication.properties | Configuração do Microsoft Entra ID e do programa. |
AuthenticationFilter.java | Redireciona solicitações não autenticadas a recursos protegidos para uma página 401. |
MsalAuthSession | Instanciado com um HttpSession . Armazena todos os atributos de sessão relacionados à MSAL no atributo de sessão. |
____Servlet.java | Todos os pontos de extremidade disponíveis são definidos em classes .java que terminam em ____Servlet.java. |
CHANGELOG.md | Lista de alterações no exemplo. |
CONTRIBUTING.md | Diretrizes para contribuir com o exemplo. |
LICENÇA | A licença para o exemplo. |
ConfidentialClientApplication
Uma ConfidentialClientApplication
instância é criada no arquivo AuthHelper.java , conforme mostrado no exemplo a seguir. Esse objeto ajuda a criar a URL de autorização do Azure AD B2C e também ajuda a trocar o token de autenticação por um token de acesso.
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.b2cAuthority(AUTHORITY + policy)
.build();
Os seguintes parâmetros são usados para a instanciação:
- A ID do cliente do aplicativo.
- O segredo do cliente, o qual é um requisito para Aplicativos cliente confidenciais.
- A Autoridade do Azure AD B2C concatenada com o adequado
UserFlowPolicy
para inscrição, entrada, edição de perfil ou redefinição de senha.
Neste exemplo, esses valores são lidos do arquivo authentication.properties usando um leitor de propriedades no arquivo Config.java .
Orientação passo a passo
As etapas a seguir fornecem um passo a passo da funcionalidade do aplicativo:
A primeira etapa do processo de entrada é enviar uma solicitação para o ponto de extremidade
/authorize
para seu locatário Azure Active Directory B2C. A instância MSAL4JConfidentialClientApplication
é usada para construir uma URL de solicitação de autorização e o aplicativo redireciona o navegador para essa URL, conforme mostra o exemplo a seguir: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);
A lista a seguir descreve os recursos desse código:
AuthorizationRequestUrlParameters
: parâmetros que devem ser definidos para criar uma AuthorizationRequestUrl.REDIRECT_URI
: onde o Azure AD B2C redireciona o navegador, com o código de autenticação, após coletar as credenciais do usuário.SCOPES
: Escopos os escopos são permissões solicitadas pelo aplicativo.Normalmente, os três escopos
openid profile offline_access
seriam suficientes para receber uma resposta de token de ID. No entanto, o MSAL4J requer que todas as respostas do Azure AD B2C também tenham um token de acesso.Para que o Azure AD B2C dispense um token de acesso, bem como um token de ID, a solicitação deve incluir um escopo de recurso adicional. Como esse aplicativo não requer um escopo de recurso externo, ele adiciona seu próprio ID de cliente como um quarto escopo para receber um token de acesso.
Você pode encontrar uma lista completa dos escopos solicitados pelo aplicativo no arquivo authentication.properties.
ResponseMode.QUERY
: o Azure AD B2C pode devolver a resposta como parâmetros de formulário em uma solicitação HTTP POST ou como parâmetros de cadeia de caracteres de consulta em uma solicitação HTTP GET.Prompt.SELECT_ACCOUNT
: o Azure AD B2C deve solicitar que o usuário selecione a conta na qual pretende fazer a autenticação.state
: uma variável exclusiva definida pelo aplicativo na sessão em cada solicitação de token e destruída após receber o retorno de chamada de redirecionamento do Azure AD B2C correspondente. A variável de estado garante que as solicitações de autorização do Azure AD B2C para o/auth_redirect endpoint
são solicitações de autorização do Azure AD B2C originadas desse aplicativo e dessa sessão, evitando assim ataques CSRF. Isso é feito no arquivo AADRedirectServlet.java .nonce
: uma variável exclusiva definida pelo aplicativo na sessão em cada solicitação de token e destruída após receber o token correspondente. Esse nonce é transcrito para os tokens resultantes distribuídos pelo Azure AD B2C, garantindo assim que não ocorra nenhum ataque de reprodução de token.
O usuário recebe um prompt de entrada do Azure Active Directory B2C. Se a tentativa de entrar for bem-sucedida, o navegador do usuário será redirecionado para o ponto de extremidade de redirecionamento do aplicativo. Uma solicitação válida ao ponto de extremidade conterá um código de autorização.
Em seguida, a instância
ConfidentialClientApplication
troca esse código de autorização por um token de ID e um token de acesso do Azure Active Directory B2C, conforme mostra o exemplo a seguir: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();
A lista a seguir descreve os recursos desse código:
AuthorizationCodeParameters
: parâmetros que devem ser definidos para trocar o código de autorização por uma ID e/ou token de acesso.authCode
: o código de autorização recebido no ponto de extremidade de redirecionamento.REDIRECT_URI
: o URI de redirecionamento usado na etapa anterior deve ser passado novamente.SCOPES
: os escopos usados na etapa anterior devem ser passados novamente.
Se
acquireToken
for bem-sucedido, as declarações de token serão extraídas e a declaração nonce será validada em relação ao nonce armazenado na sessão, conforme mostra o exemplo a seguir:parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache); validateNonce(msalAuth) processSuccessfulAuthentication(msalAuth);
Se o nonce for validado com sucesso, o status de autenticação será colocado em uma sessão do lado do servidor, utilizando os métodos expostos pela classe
MsalAuthSession
, como mostra o exemplo a seguir:msalAuth.setAuthenticated(true); msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
Mais informações
- O que é o Azure Active Directory B2C?
- Tipos de aplicativos que podem ser usados no Active Directory B2C
- Recomendações e melhores práticas para o Azure Active Directory B2C
- Configuração do Azure AD B2C
- MSAL (Biblioteca de Autenticação da Microsoft) para Java
Para obter mais informações sobre como os protocolos OAuth 2.0 funcionam neste cenário e em outros cenários, consulte Cenários de autenticação para o Microsoft Entra ID.