Como chamar uma API Web downstream a partir de um aplicativo daemon

Os aplicativos daemon do .NET podem chamar uma API Web. Os aplicativos daemon do .NET também podem chamar várias APIs Web pré-aprovadas.

Chamando uma API Web de um aplicativo daemon

Veja como usar o token para chamar uma API:

O Microsoft.Identity.Web abstrai a complexidade do MSAL.NET. Ele fornece APIs de nível superior que lidam com as partes internas do MSAL.NET, como processamento de erros de acesso condicional e armazenamento em cache.

Veja o Program.cs do aplicativo daemon chamando uma API downstream:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;

// In the Program.cs, acquire a token for your downstream API

var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddDownstreamApi("MyApi",
    tokenAcquirerFactory.Configuration.GetSection("MyWebApi"));
var sp = tokenAcquirerFactory.Build();

var api = sp.GetRequiredService<IDownstreamApi>();
var result = await api.GetForAppAsync<IEnumerable<TodoItem>>("MyApi");
Console.WriteLine($"result = {result?.Count()}");

Veja o Program.cs de um aplicativo daemon que chama o Microsoft Graph:

var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddMicrosoftGraph();
var serviceProvider = tokenAcquirerFactory.Build();
try
{
    GraphServiceClient graphServiceClient = serviceProvider.GetRequiredService<GraphServiceClient>();
    var users = await graphServiceClient.Users
        .GetAsync(r => r.Options.WithAppOnly());
    Console.WriteLine($"{users.Count} users");
    Console.ReadKey();
}
catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }

Chamando várias APIs

Para aplicativos daemon, as APIs Web que você chama precisam ser pré-aprovadas. Não há consentimento incremental com aplicativos daemon. (Não há nenhuma interação do usuário.) O administrador do locatário precisa fornecer consentimento com antecedência para o aplicativo e todas as permissões de API. Se você quiser chamar várias APIs, adquira um token para cada recurso, sempre chamando AcquireTokenForClient. O MSAL usa o cache de token do aplicativo para evitar chamadas de serviço desnecessárias.

Próximas etapas