Compartir a través de

如何从守护程序应用调用下游 Web API

.NET 守护程序应用可以调用一个 Web API。 .NET 守护程序应用还可以调用多个预先批准的 Web API。

从守护程序应用程序调用一个 Web API

下面介绍如何使用令牌来调用一个 API:

Microsoft.Identity.Web 抽象化了 MSAL.NET 的复杂性。 它提供更高级别的 API,可用于处理 MSAL.NET 的内部功能,例如处理条件访问错误、高速缓存。

下面是调用下游 API 的守护程序应用的 Program.cs:

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()}");

下面是调用 Microsoft Graph 的守护程序应用的 Program.cs:

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}"); }

调用多个 API

对于守护程序应用,需要预先批准所调用的 Web API。 守护程序应用没有增量同意。 (没有用户交互。)租户管理员需要预先为应用程序提供同意和所有 API 权限。 如果要调用多个 API,则每次调用 AcquireTokenForClient 时都需要为每个资源获取一个令牌。 MSAL 将使用应用程序令牌缓存来避免不必要的服务调用。

后续步骤