Compartilhar via


Proteja aplicativos WebSphere Liberty/Open Liberty com o Microsoft Entra ID usando o OpenID Connect

Este artigo mostra como proteger aplicativos IBM WebSphere Liberty/Open Liberty com o Microsoft Entra ID usando o OpenID Connect (OIDC).

Neste artigo, você aprenderá como:

  • Configure um provedor OICDC com o Microsoft Entra ID.
  • Proteja um aplicativo WebSphere Liberty/Open Liberty usando o OIDC.
  • Execute e teste o aplicativo WebSphere Liberty/Open Liberty.

Pré-requisitos

Configure um provedor OICDC com o Microsoft Entra ID

O OpenID Connect é um protocolo de autenticação padrão do setor com suporte do Microsoft Entra ID. Nesta seção, você configura um provedor OIDC com o Microsoft Entra ID para uso com seu aplicativo WebSphere Liberty/Open Liberty. Em uma seção posterior, você configura o aplicativo WebSphere Liberty/Open Liberty usando o OIDC para autenticar e autorizar usuários em seu locatário do Microsoft Entra.

Criar usuários no locatário no Microsoft Entra

Primeiro, crie dois usuários em seu locatário do Microsoft Entra seguindo as etapas em Como criar, convidar e excluir usuários. Você só precisa da seção Criar um usuário. Use as instruções a seguir ao longo do artigo e, em seguida, retorne a este artigo depois de criar usuários em seu locatário do Microsoft Entra.

Para criar um usuário para atuar como "administrador" no aplicativo, use as seguintes etapas:

  1. Quando você acessar a guia Básico na seção Criar um usuário, use as seguintes etapas:
    1. Para Nome UPN, insira administrador. Salve o valor para que você possa usá-lo mais tarde ao entrar no aplicativo.

    2. Para Apelido de email, selecione Derivar do nome UPN

    3. Para Nome de exibição, insira Administrador.

    4. Para Senha, selecione Gerar senha automaticamente. Copie e salve o valor da Senha para usar mais tarde ao entrar no aplicativo.

    5. Selecione Conta habilitada.

      Captura de tela do portal do Azure que mostra o painel Básico de Criar usuário para um usuário administrador.

    6. Selecione Examinar + criar>Criar. Aguarde até que o usuário seja criado.

    7. Aguarde cerca de um minuto e selecione Atualizar. Você deve ver o novo usuário na lista.

Para criar um usuário para servir como um "usuário" no aplicativo, repita essas etapas, mas use os seguintes valores:

  • Para Nome UPN, insira usuário.
  • Para Nome de exibição, insira Usuário.

Captura de tela do portal do Azure que mostra o painel Básico de Criar usuário para um usuário normal.

Registrar um aplicativo no Microsoft Entra ID

Em seguida, registre um aplicativo seguindo as etapas mostradas em Início Rápido: registrar um aplicativo com a plataforma de identidade da Microsoft. Use as instruções a seguir ao ler o artigo e, em seguida, retorne a este artigo depois de registrar e configurar o aplicativo.

  1. Quando você chegar à seção Registrar um aplicativo, use as seguintes etapas:
    1. Para Tipos de contas com suporte, selecione Contas somente neste diretório organizacional (somente o diretório padrão – locatário único).
    2. Quando o registro terminar, salve os valores de ID do Aplicativo (cliente) e de ID do Diretório (locatário) para usar posteriormente na configuração do aplicativo.
  2. Quando você chegar à seção Adicionar um URI de redirecionamento, ignore as etapas por ora. Você adicionará o URI de redirecionamento posteriormente ao executar e testar o aplicativo de exemplo de forma local neste artigo.
  3. Quando você chegar à seção Adicionar credenciais, selecione a guia Adicionar um segredo do cliente.
  4. Ao adicionar um segredo do cliente, anote o valor de Segredo do cliente a ser usado posteriormente na configuração do aplicativo.

Adicionar funções de aplicativo no seu aplicativo

Em seguida, adicione funções de aplicativo ao seu aplicativo seguindo as etapas em Adicionar funções de aplicativo ao seu aplicativo e receba-as no token. Você só precisa das seções Declarar funções para um aplicativo e Atribuir usuários e grupos a funções do Microsoft Entra. Use as instruções a seguir ao longo do artigo e, em seguida, retorne a este artigo depois de declarar funções para o aplicativo.

  1. Quando você acessar a seção Declarar funções para um aplicativo, use a interface do usuário de Funções do aplicativo para criar funções para o administrador e o usuário comum.

    1. Crie uma função de usuário administrador usando os seguintes valores:

      • Para Nome de exibição, insira Administrador.
      • Para Tipos de membros permitidos:, selecione Usuários/Grupos.
      • Em Valor, insira admin.
      • Para Descrição, insira Administrador.
      • Selecione Deseja habilitar esta função de aplicativo?.

      Captura de tela do portal do Azure que mostra o painel Criar função de aplicativo para o usuário administrador.

    2. Escolha Aplicar. Aguarde até que a função seja criada.

    3. Crie uma função de usuário regular usando as mesmas etapas, mas com os seguintes valores:

      • Para Nome de exibição, insira Usuário.
      • Para Valor, insira usuário.
      • Para Descrição, insira Usuário.

      Captura de tela do portal do Azure que mostra o painel Criar função de aplicativo para o usuário normal.

  2. Quando você acessar a seção Atribuir usuários e grupos a funções do Microsoft Entra, use as seguintes etapas:

    1. Selecione Adicionar usuário/grupo.

    2. No painel Adicionar Atribuição, para Usuários, selecione usuário Administrador e, para Selecionar uma função, selecione a função Administrador. Em seguida, selecione Atribuir. Aguarde até que a atribuição do aplicativo seja bem-sucedida. Talvez seja necessário rolar a tabela para o lado para ver a coluna Função atribuída.

    3. Repita as etapas anteriores para atribuir a função Usuário ao usuário Usuário.

    4. Selecione Atualizar e você verá os usuários e funções atribuídos no painel Usuários e grupos.

      Captura de tela do portal do Azure que mostra os usuários e as funções atribuídos.

      Talvez seja necessário ajustar a largura dos cabeçalhos das colunas para que sua exibição se pareça com a imagem.

Não siga nenhuma outra etapa em Adicionar funções de aplicativo ao seu aplicativo e receba-as no token.

Proteger um aplicativo WebSphere Liberty/Open Liberty usando o OpenID Connect

Nesta seção, você protege um aplicativo WebSphere Liberty/Open Liberty que autentica e autoriza usuários em seu locatário do Microsoft Entra usando o OIDC. Você também aprende a dar aos usuários acesso a determinadas partes do aplicativo usando o RBAC (controle de acesso baseado em função). O aplicativo usa a Configuração da Política de Segurança Programática da especificação do Jakarta Servlet. O Jakarta EE também oferece suporte a serviços da Web RESTful. Consulte a seção Próximas etapas para obter uma referência a um artigo sobre como proteger um aplicativo de serviços Web RESTful.

O aplicativo WebSphere Liberty/Open Liberty de amostra para este início rápido está no GitHub no repositório liberty-entra-id.

Habilitar autenticação e autorização para proteger o aplicativo

O aplicativo tem um recurso de página de boas-vindas definido em index.html, que é mostrado no código de exemplo a seguir. Esta página pode ser acessada por usuários não autenticados. O caminho raiz da página de boas-vindas está em /.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Greeting</title>
</head>
<body>
<h1>Hello, welcome to Open Liberty/WebSphere Liberty and Microsoft Entra ID integration!</h1>
<h1>
    <a href="/profile/user">Sign in as user</a>
</h1>
<h1>
    <a href="/profile/admin">Sign in as admin</a>
</h1>
</body>
</html>

Na página de boas-vindas, os usuários podem entrar no aplicativo para acessar a página de perfil. A página de boas-vindas tem links para entrar como usuário ou administrador. Os links estão em /profile/user e /profile/admin, respectivamente.

Os links /profile/user e /profile/admin apontam para o servlet de perfil, definido em ProfileServlet.java, conforme mostrado no código de exemplo a seguir. Esse servlet pode ser acessado apenas por usuários autenticados usando a anotação jakarta.servlet.annotation.ServletSecurity e a anotação jakarta.servlet.annotation.HttpConstraint. O atributo rolesAllowed = {"users"} especifica que somente usuários autenticados com direito de acesso users podem acessar o caminho /profile. O usuário autenticado recebe automaticamente a função users no arquivo de configuração do Liberty server.xml.

package com.example;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.HttpConstraint;
import jakarta.servlet.annotation.ServletSecurity;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

import com.ibm.websphere.security.social.UserProfileManager;
import java.util.List;

@WebServlet(name = "ProfileServlet", urlPatterns = {"/profile/user","/profile/admin"})
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"users"},
        transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL))
public class ProfileServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        List<?> roles = UserProfileManager.getUserProfile().getIdToken().getClaims().getClaim("roles",
                List.class);

        String path = request.getServletPath();
        if (path.equals("/profile/admin") && (null == roles || !roles.contains("admin"))) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN);
            return;
        }

        String username = request.getUserPrincipal().getName();
        request.setAttribute("name", username);
        request.setAttribute("roles", roles);

        request
                .getRequestDispatcher("/profile.jsp")
                .forward(request, response);
    }
}

O servlet de perfil recupera as funções do usuário do token de ID e verifica se o usuário tem a função admin quando o usuário tenta acessar o caminho /profile/admin. Se o usuário não tiver a função admin, o servlet retornará um erro 403 Proibido. Em outros casos, o servlet recupera o nome do usuário e encaminha a solicitação para a página de perfil com o nome e as funções do usuário.

A interface do usuário da página de perfil é definida em profile.jsp, conforme mostrado no exemplo a seguir. Esta página exibe o nome e as funções do usuário. A página de perfil também tem um link de saída em /logout. A página de perfil é escrita em JSP (Jakarta Server Pages). Observe o uso de expressões ${} na página. ${} Indica o uso da EL (Jakarta Expression Language). As expressões da EL são substituídas pelos valores das variáveis correspondentes quando a página é renderizada. Consulte a seção Próximas etapas para obter uma referência à especificação da EL.

<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
    <meta charset="UTF-8">
    <title>Profile</title>
</head>
<body>
<h1>Hello, ${name}</h1>
<h2>Roles</h2>
<ul>
    <c:forEach var="role" items="${roles}">
        <li>${role}</li>
    </c:forEach>
</ul>
<h1>
    <b><a href="/logout">Sign out</a></b>
</h1>
</body>
</html>

Quando o usuário seleciona o link para sair, o aplicativo chama o servlet de saída, definido em LogoutServlet.java, conforme mostrado no código de exemplo a seguir. O servlet de saída chama o método request.logout() para desconectar o usuário e, em seguida, redireciona o usuário para a página de boas-vindas.

package com.example;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.HttpConstraint;
import jakarta.servlet.annotation.ServletSecurity;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "LogoutServlet", urlPatterns = "/logout")
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"users"},
        transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL))
public class LogoutServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        request.logout();
        response.sendRedirect("/");
    }
}

Execute e teste o aplicativo WebSphere Liberty/Open Liberty

Nesta seção, você executa e testa o aplicativo WebSphere Liberty/Open Liberty para ver como ele funciona com o Microsoft Entra ID como o provedor OIDC.

Adicionar um URI de redirecionamento ao registro do aplicativo

Para executar e testar o aplicativo localmente com êxito, você precisará adicionar um URI de redirecionamento ao registro do aplicativo. Siga as instruções na seção Adicionar um URI de redirecionamento do Início Rápido: Registrar um aplicativo com a plataforma de Identidade da Microsoft e use os seguintes valores:

  • Para Configurar plataformas, selecione Web.
  • Em URIs de redirecionamento, insira https://localhost:9443/ibm/api/social-login/redirect/liberty-entra-id.

Preparar o exemplo

Use as etapas a seguir para preparar o aplicativo de exemplo:

  1. Use os seguintes comandos para clonar o aplicativo de exemplo do GitHub:

    git clone https://github.com/Azure-Samples/liberty-entra-id
    cd liberty-entra-id
    git checkout 2024-09-26
    

    Se você vir uma mensagem sobre estar no estado HEAD desanexado, essa mensagem pode ser ignorada com segurança. Esta mensagem significa apenas que você fez check-out de uma marcação.

  2. Use os seguintes comandos para definir as seguintes variáveis de ambiente com os valores anotados anteriormente:

    export CLIENT_ID==<application/client-ID>
    export CLIENT_SECRET=<client-secret>
    export TENANT_ID=<directory/tenant-ID>
    

    Essas variáveis de ambiente fornecem os valores para o suporte integrado do OIDC no WebSphere Liberty/Open Liberty. A configuração do OIDC correspondente no server.xml do Liberty é mostrada no exemplo a seguir.

     <oidcLogin
         id="liberty-entra-id" clientId="${client.id}"
         clientSecret="${client.secret}"
         discoveryEndpoint="https://login.microsoftonline.com/${tenant.id}/v2.0/.well-known/openid-configuration"
         signatureAlgorithm="RS256"
         userNameAttribute="preferred_username" />
    

    Se o valor de uma variável não estiver definido no arquivo de configuração, o WebSphere Liberty/Open Liberty lerá o valor das variáveis de ambiente seguindo sua convenção de nomenclatura. Para obter detalhes sobre a conversão de nomenclatura, consulte Precedência de substituição de variável.

Execute o aplicativo WebSphere Liberty/Open Liberty

Você pode executar o aplicativo usando liberty-maven-plugin. Para executar o aplicativo, selecione um dos seguintes métodos:

Observação

Para permitir que o WebSphere Liberty/Open Liberty se conecte ao Microsoft Entra ID, certifique-se de executar o comando no shell no qual você definiu as variáveis de ambiente mostradas na seção anterior.

  • Execute o aplicativo no modo de desenvolvimento:

    mvn liberty:dev
    
  • Execute o aplicativo no modo de runtime:

    mvn liberty:run
    

Se você quiser experimentar modos diferentes, use Ctrl+C para interromper o aplicativo e, em seguida, execute o aplicativo em outro modo.

Teste o aplicativo WebSphere Liberty/Open Liberty

Depois que o aplicativo estiver em execução, abra um navegador da Web com uma guia privada e navegue até https://localhost:9443. Como o certificado é autoassinado, você poderá ver um aviso sobre o certificado. Você pode ignorar o aviso com segurança e prosseguir para o site.

Você deve ver a página de boas-vindas com links para entrar como usuário ou um administrador. O uso de uma guia privada evita poluir qualquer atividade existente do Microsoft Entra ID que você possa ter em seu navegador normal.

Captura de tela do aplicativo de exemplo que mostra a página de boas-vindas.

Reunir as credenciais para os dois usuários

Neste artigo, o Microsoft Entra ID usa o endereço de email de cada usuário como a ID de usuário para entrar. Use as etapas a seguir para obter o endereço de e-mail do usuário administrador e do usuário comum:

  1. Entre no Centro de administração do Microsoft Entra como pelo menos Administrador de Aplicativo de nuvem.
  2. Se você tiver acesso a vários locatários, use o ícone de Configurações icon ( ) no menu superior para alternar para o locatário no qual deseja registrar o aplicativo no menu Diretórios + assinaturas.
  3. Navegue até Identidade > Usuários > Todos os Usuários.
  4. Localize o usuário administrador na lista e selecione-o.
  5. Localize o campo Nome UPN.
  6. Use o ícone de cópia ao lado do valor do campo para salvar o endereço de email do usuário na área de transferência. Salve o valor para usar depois.
  7. Para obter o endereço de email do usuário comum, siga as mesmas etapas.

Use as senhas do usuário administrador e do usuário regular que você definiu ao criar os usuários.

Exercite a funcionalidade do aplicativo

Use as seguintes etapas para exercer a funcionalidade:

  1. Selecione o link Entrar como usuário. Entre com o usuário normal criado anteriormente. Depois de entrar, o Microsoft Entra ID redireciona você para a página de perfil, onde você vê seu nome e as funções.

    Captura de tela do aplicativo de exemplo que mostra o perfil do usuário.

  2. Se esta for a primeira vez que você entra, será solicitado que você atualize sua senha. Siga as instruções para atualizar sua senha.

  3. Se você for solicitado com Sua organização requer informações de segurança adicionais. Siga as instruções para baixar e configurar o aplicativo Microsoft Authenticator, você pode selecionar Perguntar mais tarde para continuar o teste.

  4. Se você for solicitado com Permissões solicitadas, revise as permissões solicitadas pelo aplicativo. Selecione Aceitar para continuar o teste.

  5. Selecione Sair para sair do aplicativo. Depois de sair, você será redirecionado para a página de boas-vindas.

  6. Selecione o link Entrar como administrador. O Microsoft Entra ID redireciona você para a página de entrada. Entre com o usuário administrador criado anteriormente. Depois de entrar, o Microsoft Entra ID redireciona você para a página de perfil semelhante, com uma função admin diferente.

    Captura de tela do aplicativo de exemplo que mostra o perfil do administrador.

  7. Saia novamente e tente Entrar como administrador com o usuário comum que você criou anteriormente. Você deve ver uma mensagem de erro porque o usuário comum não tem a função admin.

    Captura de tela do aplicativo de exemplo que mostra a mensagem de acesso negado.

Limpar os recursos

Este artigo não direciona você para implantar seu aplicativo no Azure. Não há recursos do Azure para limpar o aplicativo, embora haja recursos do Microsoft Entra ID. Para implantar um aplicativo no Azure, você pode seguir as diretrizes referenciadas na próxima seção.

Quando você terminar com os recursos para este aplicativo de exemplo, use as etapas a seguir para limpar os recursos do Microsoft Entra ID. A remoção de recursos não utilizados do Microsoft Entra ID é uma prática recomendada de segurança importante.

  1. Remova o registro do aplicativo que você criou seguindo as etapas em Remover um aplicativo registrado na plataforma de identidade da Microsoft. Você só precisa seguir as etapas na seção Remover um aplicativo criado por sua organização.
  2. O ato de remover o registro do aplicativo também deve excluir o aplicativo empresarial. Para obter mais informações sobre como excluir aplicativos empresariais, consulte Excluir um aplicativo empresarial.
  3. Exclua os usuários que você criou seguindo as etapas em Como criar, convidar e excluir usuários.

Próximas etapas

Neste início rápido, você protege os aplicativos WebSphere Liberty/Open Liberty com o Microsoft Entra ID usando o OIDC. Para saber mais, explore os seguintes recursos: