Поделиться через


Веб-API, который вызывает другие веб-API. Конфигурация кода

В этой статье описывается настройка кода для веб-ПРИЛОЖЕНИЯ API с помощью потока кода авторизации OAuth 2.0.

Корпорация Майкрософт рекомендует использовать пакет NuGet Microsoft.Identity.Web при разработке защищенных API для ASP.NET Core, которые вызывают нижестоящие веб-API. В статье Защищенный веб-API: конфигурация кода | Microsoft.Identity.Web есть краткое описание этой библиотеки в контексте веб-API.

Необходимые компоненты

Настройка приложения

Выберите язык для веб-API.

Секреты клиента или сертификаты клиента

Учитывая, что веб-приложение теперь вызывает нижестоящий веб-API, укажите секрет клиента или сертификат клиента в файле appsettings.json. Можно также добавить раздел, который указывает:

  • URL-адрес нижестоящего веб-API;
  • необходимые области для вызова API.

В следующем примере эти параметры задаются в разделе GraphBeta.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
    {
      "SourceType": "ClientSecret",
      "ClientSecret":"[Enter_the_Client_Secret_Here]"
    }
  ]
 },
 "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
    }
}

Примечание.

Вы можете предложить коллекцию учетных данных клиента, включая решение без учетных данных, например федерацию удостоверений рабочей нагрузки для Azure Kubernetes. Предыдущие версии Microsoft.Identity.Web выразили секрет клиента в одном свойстве ClientSecret вместо ClientCredentials. Это по-прежнему поддерживается для обратной совместимости, но нельзя использовать свойство ClientSecret и коллекцию ClientCredentials.

Вместо секрета клиента можно предоставить сертификат клиента. В приведенном ниже фрагменте кода показано использование сертификата, хранящегося в Azure Key Vault.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
        "KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
      }
   ]
  },
  "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
  }
}

Предупреждение

Если вы забыли изменить Scopes массив, при попытке использовать IDownstreamApi области будут отображаться null, и IDownstreamApi будет предпринята попытка анонимного (неуверенного) вызова нижестоящего API, что приведет к 401/unauthenticatedвозникновению ошибки.

Microsoft.Identity.Web позволяет описывать сертификаты несколькими способами, как по конфигурации, так и по коду. Дополнительные сведения см. в статье на GitHub об использовании Microsoft.Identity.Web с сертификатами.

Program.cs

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Веб-API должен получить маркер для нижестоящего API. Укажите его, добавив .EnableTokenAcquisitionToCallDownstreamApi() строку после .AddMicrosoftIdentityWebApi(Configuration). Эта строка предоставляет ITokenAcquisition службу, которую можно использовать в действиях контроллера или страниц.

Однако альтернативным способом является реализация кэша маркеров. Например, добавление .AddInMemoryTokenCaches()к Program.cs позволяет кэшировать маркер в памяти.

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Microsoft.Identity.Web предоставляет два механизма вызова нижестоящего веб-API из другого API. Выбор зависит от того, что необходимо вызывать: Microsoft Graph или другой API.

Вариант 1. Вызов Microsoft Graph

Чтобы вызвать Microsoft Graph, Microsoft.Identity.Web позволяет напрямую использовать GraphServiceClient (предоставляемый пакетом SDK Microsoft Graph) в действиях API.

Примечание.

Существует постоянная проблема с пакетом SDK Microsoft Graph версии 5+. Дополнительные сведения см. в статье о проблеме GitHub.

Чтобы предоставить Microsoft Graph, выполните указанные ниже действия.

  1. Добавьте в проект пакет NuGet Microsoft.Identity.Web.GraphServiceClient.
  2. Добавьте .AddMicrosoftGraph() после .EnableTokenAcquisitionToCallDownstreamApi() Program.cs. .AddMicrosoftGraph() имеет несколько переопределений. При использовании переопределения, которое принимает в качестве параметра раздел конфигурации, код принимает следующий вид:
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
    .AddInMemoryTokenCaches();
// ...

Вариант 2. Вызов нижестоящего веб-API, отличного от Microsoft Graph

  1. Добавьте в проект пакет NuGet Microsoft.Identity.Web.DownstreamApi.
  2. Добавьте .AddDownstreamApi() после .EnableTokenAcquisitionToCallDownstreamApi() Program.cs. Код становится следующим:
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddInMemoryTokenCaches();
// ...

где;

  • MyApi обозначает имя нижестоящего веб-API, который веб-API намерен вызывать.
  • MyApiScope — это область, необходимая для запроса веб-API для взаимодействия с нижестоящим веб-API.

Эти значения будут представлены в формате JSON, который будет похож на следующий фрагмент кода.

"DownstreamAPI": {
      "BaseUrl": "https://downstreamapi.contoso.com/",
      "Scopes": "user.read"
    },

Если веб-приложение должно вызвать другой ресурс API, повторите .AddDownstreamApi() метод с соответствующей областью, как показано в следующем фрагменте кода:

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddDownstreamApi("MyApi2", Configuration.GetSection("MyApi2Scope"))
    .AddInMemoryTokenCaches();
// ...

Обратите внимание, что .EnableTokenAcquisitionToCallDownstreamApi вызывается без каких-либо параметров, что означает, что маркер доступа приобретается только вовремя, так как контроллер запрашивает маркер, указав область.

Область также может быть передана при вызове .EnableTokenAcquisitionToCallDownstreamApi, что позволит веб-приложению получить маркер во время самого входа пользователя. Затем маркер будет извлечен из кэша при запросе контроллера.

Как и в веб-приложениях, можно выбрать различные реализации кэша маркеров. Дополнительные сведения см. в статье на GitHub Microsoft identity web - Token cache serialization (Microsoft.Identity.Web: сериализация кэша маркеров).

На следующем рисунке показаны возможности Microsoft.Identity.Web и влияние на Program.cs:

Блок-схема с вариантами настройки службы в Startup.cs для вызова веб-API и указания реализации кэша маркеров

Примечание.

Чтобы полностью разобраться в приведенных здесь примерах кода, ознакомьтесь с базовыми понятиями ASP.NET, в частности с внедрением зависимостей и параметрами.

Вы также можете увидеть пример реализации потока OBO в Node.js и Функциях Azure.

Протокол

Дополнительные сведения о протоколе OBO см. в статье Поток On-Behalf-Of в OAuth 2.0 и платформа удостоверений Майкрософт.

Следующий шаг