Руководство. Вызов защищенного веб-API из приложения управляющей программы .NET
применяется к: арендаторы рабочей силы
внешние клиенты (подробнее)
В этом руководстве показано, как вызвать защищенный веб-API из приложения управляющей программы .NET. Вы включаете клиентское демон-приложение для получения токена доступа с использованием его собственной идентификации, а затем вызываете веб-API. В нашем случае мы вызываем защищенную конечную точку Microsoft Graph.
В этом руководстве;
- Настройте демон-приложение для использования деталей регистрации приложения. Убедитесь, что приложение предоставляет разрешение User.Read.All в API Microsoft Graph.
- Создайте демон-приложение, которое получает токен от своего имени и обращается к защищенному веб API.
Необходимые условия
- .NET. В этом руководстве мы используем .NET 9.0.
- Visual Studio Code или другой редактор кода.
-
регистрация приложения в учетной записи арендатора. Убедитесь, что у вас есть следующие сведения о регистрации приложения:
- Идентификатор приложения (клиента) зарегистрированного клиентского веб-приложения.
- Идентификатор каталога (клиента), где вы зарегистрировали веб-приложение.
- Значение ключа клиента для веб-приложения, которое вы создали.
Создание приложения демона .NET
Откройте терминал и перейдите в папку, в которой хотите жить проект.
Инициализируйте консольное приложение .NET и перейдите в корневую папку.
dotnet new console -n DotnetDaemon cd DotnetDaemon
Установка пакетов
Установите пакеты Microsoft.Identity.Web
и Microsoft.Identity.Web.DownstreamApi
:
dotnet add package Microsoft.Identity.Web
dotnet add package Microsoft.Identity.Web.DownstreamApi
Microsoft.Identity.Web
предоставляет клей между ASP.NET Core, ПО промежуточного слоя проверки подлинности и библиотекой проверки подлинности Майкрософт (MSAL) для .NET, что упрощает добавление возможностей проверки подлинности и авторизации в приложение.
Microsoft.Identity.Web.DownstreamApi
предоставляет интерфейс, используемый для вызова нижестоящего API.
Создайте файл appsettings.json и добавьте конфигурации регистрации
Создайте файл appsettings.json в корневой папке приложения.
Добавьте сведения о регистрации приложения в файл appsettings.json.
{ "AzureAd": { // "Authority": "", you can use this for customer tenants in place of Instance and TenantId values "Instance": "https://login.microsoftonline.com/", "TenantId": "Enter_the_Tenant_ID_Here", "ClientId": "Enter_the_Application_ID_Here", "ClientCredentials": [ { "SourceType": "ClientSecret", "ClientSecret": "Enter_the_Client_Secret_Here" } ] }, "DownstreamApi": { "BaseUrl": "https://graph.microsoft.com", "RelativePath": "/v1.0/users/", "RequestAppToken": true, "Scopes": [ "https://graph.microsoft.com/.default" ] } }
Замените следующие значения собственными:
Ценность Описание Введите_идентификатор_приложения_здесь Идентификатор приложения (клиента) демон-приложения клиента, которое вы зарегистрировали. Введите_секретный_ключ_клиента_здесь Секретное значение, созданное для демон-приложения. Введите_идентификатор_арендатора_здесь Идентификатор клиента каталога или клиента, в котором зарегистрировано приложение. Заметка
Для приложений, зарегистрированных во внешнем клиенте, можно использовать Authority и удалить как экземпляр, так и TenantId.
"Authority": "https://<Enter_the_Tenant_Subdomain_Here>.ciamlogin.com/"
. Где Enter_the_Tenant_Subdomain_Here является поддоменом клиента.Добавьте файл appsettings.json в файл проекта. Файл проекта представляет собой файл .csproj в вашем проекте. Это связано с тем, что файл необходимо скопировать в выходной каталог.
<ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
Получение токена доступа
Откройте файл program.cs в редакторе кода и удалите его содержимое.
Добавьте пакеты в файл.
using Microsoft.Extensions.DependencyInjection; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Web;
Создайте экземпляр получения токена. Используйте метод
GetDefaultInstance
классаTokenAcquirerFactory
пакетаMicrosoft.Identity.Web
для создания экземпляра для получения токена. По умолчанию экземпляр считывает файл appsettings.json, если он существует в той же папке, что и приложение.GetDefaultInstance
также позволяет добавлять службы в коллекцию служб.Добавьте эту строку кода в файл program.cs:
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
Настройте параметры приложения так, чтобы они считывались из конфигурации, и добавьте сервис
DownstreamApi
. СлужбаDownstreamApi
предоставляет интерфейс, используемый для вызова нижестоящего API. Мы вызываем эту службу DownstreamAPI в объекте конфигурации. Приложение управляющей программы считывает подчиненные конфигурации API из раздела DownstreamApiappsettings.json. По умолчанию вы получаете кэш токенов в памяти.Добавьте следующий фрагмент кода в файл program.cs:
const string ServiceName = "DownstreamApi"; tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName, tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
Вызываемой ниже API является Microsoft Graph. В этом руководстве мы используем службу
DownstreamApi
. Вы также можете использовать Microsoft Graph SDK.Создайте модуль получения токенов. Это объединяет все службы, которые вы добавляете, и возвращает поставщика услуг. Используйте этого поставщика услуг, чтобы получить доступ к ресурсу API, который вы добавляете. В этом случае вы добавляете только один ресурс API в качестве подчиненной службы, к которой требуется доступ.
Добавьте следующий фрагмент кода в файл program.cs:
var serviceProvider = tokenAcquirerFactory.Build();
Вызов веб-API
Добавьте код для вызова защищенного веб-API с помощью интерфейса
IDownstreamApi
. В этом руководстве мы вызываем конечную точку API Microsoft Graph.Добавьте этот код в файл program.cs:
try { IDownstreamApi downstreamApi = serviceProvider.GetRequiredService<IDownstreamApi>(); var response = await downstreamApi.GetForAppAsync<HttpResponseMessage>("DownstreamApi"); var content = await response.Content.ReadAsStringAsync(); var statusCode = response.StatusCode; Console.WriteLine($"Response status code: {statusCode}"); if (!content.Any()) { Console.WriteLine("There are no users to display."); return; } Console.WriteLine(content); } catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }
Код вызывает конечную точку, определенную в файле appsettings.json. Метод
GetForAppAsync
интерфейсаIDownstreamApi
используется для вызова конечной точки. Приложение выполняет вызов от собственного имени. Метод возвращает объектHttpResponseMessage
. Затем ответ считывается как строка и отображается в консоли.
Запустите клиентское демон-приложение
Перейдите в корневую папку приложения управляющей программы и выполните следующую команду:
dotnet run
Если все в порядке, вы увидите код состояния ответа : ОК в терминале. Если есть пользователи, пользователи отображаются в терминале, в противном случае отображается сообщение нет пользователей для отображения.
Если возникают ошибки, в терминале отображается сообщение об ошибке.
Диагностировать
В случае, если возникнут ошибки
- Подтвердите сведения о регистрации, добавленные в файл appsettings.json.
- Убедитесь, что в файл проекта добавлен файл appsettings.json.
- Убедитесь, что разрешения приложения настроены правильно.