调用 Web API 的 Web API:代码配置

注册 Web API 后,可以配置应用程序的代码。

用于配置 Web API 的代码,配置后它就可以调用下游 Web API,而后者又基于用来保护 Web API 的代码。 有关详细信息,请参阅受保护的 Web API:应用配置

Microsoft.Identity.Web

Microsoft 建议在调用下游 Web API 开发 ASP.NET Core 保护的 API 时,使用 Microsoft.Identity.Web NuGet 包。 请参阅受保护的 Web API:代码配置 | Microsoft.Identity.Web,在 Web API 的上下文中快速了解该库。

客户端密码或客户端证书

鉴于 Web API 现在调用下游的 Web API,请提供 appsettings.json 文件中客户端密码或客户端证书。 你还可以添加一个节来指定:

  • 下游 Web API 的 URL
  • 调用 API 所需的范围

在下面的示例中,GraphBeta 节指定了这些设置。

{
  "AzureAd": {
    "Instance": "https://login.partner.microsoftonline.cn/",
    "ClientId": "[Client_id-of-web-api-eg-2ec40e65-ba09-4853-bcde-bcb60029e596]",
    "TenantId": "common"

   // To call an API
   "ClientSecret": "[Copy the client secret added to the app from the Azure portal]",
   "ClientCertificates": [
  ]
 },
 "GraphBeta": {
    "BaseUrl": "https://microsoftgraph.chinacloudapi.cn/beta",
    "Scopes": "https://microsoftgraph.chinacloudapi.cn/user.read"
    }
}

你可以提供客户端证书,而不是客户端密码。 以下代码片段演示如何使用存储在 Azure Key Vault 中的证书。

{
  "AzureAd": {
    "Instance": "https://login.partner.microsoftonline.cn/",
    "ClientId": "[Client_id-of-web-api-eg-2ec40e65-ba09-4853-bcde-bcb60029e596]",
    "TenantId": "common"

   // To call an API
   "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://msidentitywebsamples.vault.azure.cn",
        "KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
      }
   ]
  },
  "GraphBeta": {
    "BaseUrl": "https://microsoftgraph.chinacloudapi.cn/beta",
    "Scopes": "https://microsoftgraph.chinacloudapi.cn/user.read"
  }
}

Microsoft.Identity.Web 提供了多种通过配置或代码描述证书的方法。 有关详细信息,请参阅 GitHub 上的 Microsoft.Identity.Web wiki - 使用证书

Startup.cs

Web API 将需要获取下游 API 的令牌。 可通过在 .AddMicrosoftIdentityWebApi(Configuration) 后面添加 .EnableTokenAcquisitionToCallDownstreamApi() 行来指定它。 此行公开 ITokenAcquisition 服务,它可用于控制器/页面操作。 不过,正如你将在接下来的两个要点中看到的那样,可更简单地操作。 还需在 Startup.cs 中选择令牌缓存实现,例如 .AddInMemoryTokenCaches()

using Microsoft.Identity.Web;

public class Startup
{
  // ...
  public void ConfigureServices(IServiceCollection services)
  {
  // ...
  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
          .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
            .EnableTokenAcquisitionToCallDownstreamApi()
            .AddInMemoryTokenCaches();
   // ...
  }
  // ...
}

如果你不想亲自获取令牌,Microsoft.Identity.Web 提供两种机制来从另一 API 调用下游 Web API。 选择哪种方式取决于你是要调用 Microsoft Graph 还是调用另一个 API。

选项 1:调用 Microsoft Graph

如果要调用 Microsoft Graph,可通过 Microsoft.Identity.Web 在 API 操作中直接使用 GraphServiceClient(由 Microsoft Graph SDK 公开)。 若要公开 Microsoft Graph:

  1. Microsoft.Identity.Web.MicrosoftGraph NuGet 包添加到项目。
  2. 在 Startup.cs 文件的 .EnableTokenAcquisitionToCallDownstreamApi() 后面添加 .AddMicrosoftGraph().AddMicrosoftGraph() 具有多个重写。 使用将配置部分作为参数的重写,代码变为:
using Microsoft.Identity.Web;

public class Startup
{
  // ...
  public void ConfigureServices(IServiceCollection services)
  {
  // ...
  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
          .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
            .EnableTokenAcquisitionToCallDownstreamApi()
               .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
            .AddInMemoryTokenCaches();
   // ...
  }
  // ...
}

选项 2:调用下游 Web API,而不是 Microsoft Graph

若要调用下游 Web API 而不是 Microsoft Graph,请使用 Microsoft.Identity.Web 提供的 .AddDownstreamWebApi(),它可请求令牌并调用下游 Web API。

using Microsoft.Identity.Web;

public class Startup
{
  // ...
  public void ConfigureServices(IServiceCollection services)
  {
  // ...
  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
          .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi()
               .AddDownstreamWebApi("MyApi", Configuration.GetSection("GraphBeta"))
            .AddInMemoryTokenCaches();
   // ...
  }
  // ...
}

与 Web 应用一样,你可以选择各种令牌缓存实现。 有关详细信息,请参阅 GitHub 上的 Microsoft 标识 Web - 令牌缓存序列化

下图显示 Microsoft.Identity.Web 的各种可能性以及它们对 Startup.cs 文件的影响 :

此框图显示了 Startup.cs 中的服务配置选项,用于调用 Web API 和指定令牌缓存实现

备注

若要完全理解以下代码示例,请熟悉 ASP.NET Core 基础知识,尤其是依赖项注入选项

也可以参阅 Node.js 和 Azure Functions 中的 OBO 流实现示例。

协议

有关 OBO 协议的详细信息,请参阅 Microsoft 标识平台和 OAuth 2.0 代理流

后续步骤

转到此方案中的下一篇文章:获取应用的令牌