Compartilhar via


Tutorial: Chamar uma API Web protegida do seu aplicativo daemon do .NET

Aplica-se a: Círculo verde com um símbolo de marca de seleção branco. Locatários da força de trabalho Círculo verde com símbolo de marca de seleção branca. Locatários externos (saiba mais)

Este tutorial demonstra como chamar uma API Web protegida de um aplicativo daemon do .NET. Você permite que o aplicativo daemon cliente adquira um token de acesso usando sua própria identidade e, em seguida, chame a API Web. Em nosso caso, acessamos um endpoint protegido do Microsoft Graph.

Neste tutorial;

  • Configure um aplicativo daemon para usar os detalhes do registro do aplicativo. Conceda ao aplicativo a permissão User.Read.All na API do Microsoft Graph.
  • Crie um aplicativo daemon que adquira um token em seu próprio nome e chame uma API Web protegida.

Pré-requisitos

  • .NET. Neste tutorial, usamos o .NET 9.0.
  • Visual Studio Code ou qualquer outro editor de código.
  • Um registro de aplicativo no seu locatário. Verifique se você tem o seguinte nos detalhes do registro do aplicativo:
    • A ID do Aplicativo (cliente) do aplicativo Web cliente que você registrou.
    • O ID do diretório (locatário) onde você registrou seu aplicativo Web.
    • O valor do Secreto do cliente para o aplicativo Web que você criou.

Criar um aplicativo daemon do .NET

  1. Abra o terminal e navegue até a pasta em que você deseja que seu projeto resida.

  2. Inicialize um aplicativo de console do .NET e navegue até sua pasta raiz.

    dotnet new console -n DotnetDaemon
    cd DotnetDaemon
    

Instalar pacotes

Instale os pacotes Microsoft.Identity.Web e Microsoft.Identity.Web.DownstreamApi:

dotnet add package Microsoft.Identity.Web
dotnet add package Microsoft.Identity.Web.DownstreamApi

Microsoft.Identity.Web fornece a associação entre ASP.NET Core, o middleware de autenticação e a MSAL (Biblioteca de Autenticação da Microsoft) para .NET, facilitando a adição de recursos de autenticação e autorização ao seu aplicativo. Microsoft.Identity.Web.DownstreamApi fornece uma interface usada para chamar uma API downstream.

Criar appsettings.json arquivo para adicionar configurações de registro

  1. Crie o arquivo appsettings.json na pasta raiz do aplicativo.

  2. Adicione detalhes de registro de aplicativo ao arquivo appsettings.json.

    {
        "AzureAd": {
            // "Authority": "", you can use this for customer tenants in place of Instance and TenantId values
            "Instance": "https://login.microsoftonline.com/",
            "TenantId": "Enter_the_Tenant_ID_Here",
            "ClientId": "Enter_the_Application_ID_Here",
            "ClientCredentials": [
                {
                    "SourceType": "ClientSecret",
                    "ClientSecret": "Enter_the_Client_Secret_Here"
                }
            ]
        },
        "DownstreamApi": {
            "BaseUrl": "https://graph.microsoft.com",
            "RelativePath": "/v1.0/users/",
            "RequestAppToken": true,
            "Scopes": [
                "https://graph.microsoft.com/.default"
            ]
        }
    }
    

    Substitua os seguintes valores pelos seus próprios valores:

    Valor Descrição
    Enter_the_Application_ID_Here A ID do aplicativo (cliente) do aplicativo daemon cliente registrado.
    Enter_the_Client_Secret_Here O valor do segredo do aplicativo daemon criado.
    Enter_the_Tenant_ID_Here A ID do locatário/diretório em que o aplicativo está registrado.

    Observação

    Para aplicativos registrados em locatário externo, você pode usar a Autoridade e remover a Instância e a TenantId.

    "Authority": "https://<Enter_the_Tenant_Subdomain_Here>.ciamlogin.com/". Onde Enter_the_Tenant_Subdomain_Here é o subdomínio do locatário.

  3. Adicione o arquivo appsettings.json ao arquivo de projeto. O arquivo de projeto é um arquivo .csproj em seu projeto. Isso ocorre porque o arquivo precisa ser copiado para o diretório de saída.

    <ItemGroup>
        <None Update="appsettings.json">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
    

Adquirir o token de acesso

  1. Abra o arquivo program.cs no editor de código e exclua seu conteúdo.

  2. Adicione seus pacotes ao arquivo.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    
  3. Crie a instância de aquisição de token. Use o método GetDefaultInstance da classe TokenAcquirerFactory do pacote Microsoft.Identity.Web para criar a instância de aquisição de token. Por padrão, a instância lê um arquivo appsettings.json se ele existir na mesma pasta que o aplicativo. GetDefaultInstance também nos permite adicionar serviços à coleção de serviços.

    Adicione essa linha de código ao arquivo program.cs :

    var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
    
  4. Configure as opções do aplicativo a serem lidas a partir da configuração e adicione o serviço DownstreamApi. O DownstreamApi serviço fornece uma interface usada para chamar uma API downstream. Chamamos esse serviço de DownstreamAPI no objeto de configuração. O aplicativo daemon lê as configurações de API downstream da seção DownstreamApi de appsettings.json. Por padrão, você obtém um cache de token na memória.

    Adicione o seguinte snippet de código ao arquivo program.cs :

    const string ServiceName = "DownstreamApi";
    
    tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName,
        tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
    

    A API downstream que você chama é o Microsoft Graph. Neste tutorial, usamos o DownstreamApi serviço. Você também pode usar o SDK do Microsoft Graph.

  5. Crie o adquirente de token. Isso compõe todos os serviços que você adiciona e retorna um provedor de serviços. Use esse provedor de serviços para obter acesso ao recurso de API que você adiciona. Nesse caso, você adiciona apenas um recurso de API como um serviço downstream ao qual deseja acessar.

    Adicione o seguinte snippet de código ao arquivo program.cs :

    var serviceProvider = tokenAcquirerFactory.Build();
    

Chamar a API Web

  1. Adicione código para chamar sua API Web protegida usando a IDownstreamApi interface. Neste tutorial, chamamos um ponto de extremidade da API do Microsoft Graph.

  2. Adicione este código ao arquivo program.cs :

    try
    {
        IDownstreamApi downstreamApi = serviceProvider.GetRequiredService<IDownstreamApi>();
    
        var response = await downstreamApi.GetForAppAsync<HttpResponseMessage>("DownstreamApi");
        var content = await response.Content.ReadAsStringAsync();
        var statusCode = response.StatusCode;
    
        Console.WriteLine($"Response status code: {statusCode}");
    
        if (!content.Any())
        {
            Console.WriteLine("There are no users to display.");
            return;
        }
    
        Console.WriteLine(content);
    }
    catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }
    

    O código chama o endpoint que você especificou no arquivo appsettings.json. O método GetForAppAsync da interface IDownstreamApi é usado para chamar o ponto de extremidade. O aplicativo faz uma chamada em seu próprio nome. O método retorna um HttpResponseMessage objeto. Em seguida, a resposta é lida como uma cadeia de caracteres e exibida no console.

Executar o aplicativo daemon do cliente

Navegue até a pasta raiz do aplicativo daemon e execute o seguinte comando:

dotnet run

Se tudo estiver bem, você deverá ver o código de status de resposta: OK em seu terminal. Se houver usuários, os usuários serão listados no terminal, caso contrário, você verá a mensagem que não há usuários a serem exibidos.

Se ocorrerem erros, você verá uma mensagem de erro no terminal.

Solucionar problemas

Caso você encontre erros,

  • Confirme os detalhes de registro adicionados ao arquivo appsettings.json .
  • Confirme se você adicionou o arquivo appsettings.json ao arquivo de projeto.
  • Confirme se as permissões do aplicativo estão configuradas corretamente.