Partilhar via


Testar uma API Web protegida do ASP.NET Core

Aplica-se a: círculo verde com um símbolo de marca de seleção branco que indica que o conteúdo a seguir se aplica aos locatários da força de trabalho. Locatários da força de trabalho Círculo verde com um símbolo de marca de seleção branco que indica que o conteúdo a seguir se aplica a locatários externos. Inquilinos externos (saiba mais)

Este tutorial é a parte final de uma série que demonstra a criação e o teste de uma API da Web protegida registrada em um locatário do Microsoft Entra. Na Parte 1 desta série, você criou uma API Web ASP.NET Core e protegeu seus endpoints. Agora você criará um aplicativo daemon leve, registrá-lo-á em seu locatário e usará o aplicativo daemon para testar a API Web que você criou.

Neste tutorial, você:

  • Registrar um aplicativo daemon
  • Atribuir uma função de aplicativo ao seu aplicativo daemon
  • Crie seu aplicativo daemon
  • Execute seu aplicativo daemon para chamar a API da Web protegida

Pré-requisitos

Registrar o aplicativo daemon

As etapas a seguir mostram como registrar seu aplicativo daemon no centro de administração do Microsoft Entra:

  1. Entre no centro de administração do Microsoft Entra com no mínimo a função de Programador de Aplicações.

  2. Se tiver acesso a vários inquilinos, utilize o ícone Definições no menu superior para mudar para o inquilino externo a partir do menu Diretórios + subscrições.

  3. Navegue até Entra ID>Registros de Aplicativos.

  4. Selecione + Novo registo.

  5. Na página Registar uma aplicação que aparece, introduza as informações de registo da sua aplicação:

    1. Na seção Nome, insira um nome de aplicativo significativo que será exibido para os usuários do aplicativo, por exemplo, ciam-client-app.

    2. Em Tipos de conta suportados, selecione Contas somente neste diretório organizacional.

  6. Selecione Register.

  7. O painel Visão geral do aplicativo é exibido quando o registro é concluído. Registe o ID do Diretório (locatário) e o ID da Aplicação (cliente) para serem usados no código-fonte da sua aplicação.

Crie um segredo de cliente para o aplicativo registrado. O aplicativo usa o segredo do cliente para provar sua identidade quando solicita tokens:

  1. Na página Registos de aplicações, selecione a aplicação que criou (como o segredo do cliente da aplicação web ) para abrir a sua página de Visão Geral .
  2. Em Gerenciar, selecione Certificados & segredos>Segredos do cliente>Novo segredo do cliente.
  3. Na caixa de Descrição , insira uma descrição para o segredo do cliente (por exemplo, segredo do cliente do aplicativo web ).
  4. Em Expira, selecione uma duração para a qual o segredo é válido (de acordo com as regras de segurança da sua organização) e, em seguida, selecione Adicionar.
  5. Registre o valor do segredo. Use esse valor para configuração em uma etapa posterior. O valor secreto não será exibido novamente e não poderá ser recuperado por nenhum meio, depois que você navegar para longe dos Certificados e segredos. Certifique-se de gravá-lo.

Atribuir uma função de aplicativo ao seu aplicativo daemon

Os aplicativos que se autenticam sozinhos sem um usuário exigem permissões de aplicativo (também conhecidas como funções). Essas permissões permitem que o próprio aplicativo acesse recursos diretamente. Por outro lado, se estivéssemos testando a API com um usuário conectado, atribuiríamos permissões delegadas (escopos). As permissões delegadas permitem que o aplicativo aja em nome do usuário, limitado aos direitos de acesso do usuário. Siga estas etapas para atribuir permissões de aplicativo ao aplicativo daemon:

  1. Na página Registros de aplicativos, selecione o aplicativo que você criou, como ciam-client-app.

  2. Em Gerenciar, selecione permissões de API.

  3. Em Permissões configuradas, selecione Adicionar uma permissão.

  4. Selecione o separador APIs utilizadas pela sua organização.

  5. Na lista de APIs, selecione a API, como ciam-ToDoList-api.

  6. Selecione a opção Permissões do aplicativo. Selecionamos esta opção quando a aplicação inicia a sessão como ela própria, mas não em nome de um utilizador.

  7. Na lista de permissões, selecione TodoList.Read.All, ToDoList.ReadWrite.All (use a caixa de pesquisa, se necessário).

  8. Selecione o botão Adicionar permissões .

  9. Neste ponto, você atribuiu as permissões corretamente. No entanto, como o aplicativo daemon não permite que os usuários interajam com ele, os próprios usuários não podem consentir com essas permissões. Para resolver esse problema, você, como administrador, deve consentir com essas permissões em nome de todos os usuários no locatário:

    1. Selecione Conceder consentimento de administrador para <o nome> do seu inquilino e, em seguida, selecione Sim.
    2. Selecione Atualizar e, em seguida, verifique se Concedido para <o nome do locatário> aparece em Status em ambas as permissões.

Criar um aplicativo daemon

  1. Inicialize um aplicativo de console .NET e navegue até sua pasta raiz:

    dotnet new console -o MyTestApp
    cd MyTestApp
    
  2. Instale o MSAL.NET para ajudar com a manipulação da autenticação executando o seguinte comando:

    dotnet add package Microsoft.Identity.Client
    
  3. Execute seu projeto de API e anote a porta na qual ele está sendo executado.

  4. Abra o arquivo Program.cs e substitua o código "Hello world" pelo código a seguir.

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    HttpClient client = new HttpClient();
    
    var response = await client.GetAsync("http://localhost:<your-api-port>/api/todolist);
    Console.WriteLine("Your response is: " + response.StatusCode);
    

    Navegue até o diretório raiz do aplicativo daemon e execute o aplicativo usando o comando dotnet run. Esse código envia uma solicitação sem um token de acesso. Deverás ver a string: A tua resposta é: Não autorizado impresso no teu console.

  5. Remova o código na etapa 4 e substitua pelo seguinte para testar sua API enviando uma solicitação com um token de acesso válido. Este aplicativo daemon usa o fluxo de credenciais do cliente para adquirir um token de acesso à medida que ele se autentica sem interação do usuário.

    using Microsoft.Identity.Client;
    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    HttpClient client = new HttpClient();
    
    var clientId = "<your-daemon-app-client-id>";
    var clientSecret = "<your-daemon-app-secret>";
    var scopes = new[] {"api://<your-web-api-application-id>/.default"};
    var tenantId = "<your-tenant-id>";     //Use in workforce tenant configuration
    var tenantName = "<your-tenant-name>"; //Use in external tenant configuration
    var authority = $"https://login.microsoftonline.com/{tenantId}"; // Use "https://{tenantName}.ciamlogin.com" for external tenant configuration 
    
    var app = ConfidentialClientApplicationBuilder
        .Create(clientId)
        .WithAuthority(authority)
        .WithClientSecret(clientSecret)
        .Build();
    
    var result = await app.AcquireTokenForClient(new string[] { scopes }).ExecuteAsync();
    Console.WriteLine($"Access Token: {result.AccessToken}");
    
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
    var response = await client.GetAsync("http://localhost:/<your-api-port>/api/todolist");
    var content = await response.Content.ReadAsStringAsync();
    
    Console.WriteLine("Your response is: " + response.StatusCode);
    Console.WriteLine(content);
    
  6. Substitua os espaços reservados no código pela ID do cliente da aplicação daemon, chave secreta, ID da aplicação de API Web e nome do locatário.

    • Para locatários externos, use a autoridade no formato: "https://{tenantName}.ciamlogin.com/"
    • Para locatários de força de trabalho, use a autoridade na forma: "https://login.microsoftonline.com/{tenantId}"
  7. Navegue até o diretório raiz do aplicativo daemon e execute o aplicativo usando o comando dotnet run. Esse código envia uma solicitação com um token de acesso válido. Você deve ver a string: Sua resposta é: OK impresso no console.