Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: арендаторы рабочей силы
внешние арендаторы (подробнее)
В этой статье описывается, как настроить код для приложения веб-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, выполните указанные ниже действия.
- Добавьте в проект пакет NuGet Microsoft.Identity.Web.GraphServiceClient.
- Добавьте
.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
- Добавьте в проект пакет NuGet Microsoft.Identity.Web.DownstreamApi.
- Добавьте
.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:
Примечание.
Чтобы полностью разобраться в приведенных здесь примерах кода, ознакомьтесь с базовыми понятиями ASP.NET, в частности с внедрением зависимостей и параметрами.
Вы также можете увидеть пример реализации потока OBO в Node.js и Функциях Azure.
Протокол
Дополнительные сведения о протоколе OBO см. в статье платформа удостоверений Майкрософт и поток On-Behalf-Of в OAuth 2.0.