Руководство. Вызов защищенного веб-API из приложения управляющей программы .NET
В этом руководстве представлена последняя часть серии, демонстрирующая вызов защищенного веб-API из приложения управляющей программы .NET. В части 1 этой серии вы подготовили внешний клиент для авторизации приложения управляющей программы .NET. В этом руководстве вы создадите клиентское приложение управляющей программы и вызовите защищенный веб-API. Приложение управляющей программы клиента позволяет получить маркер доступа с помощью собственного удостоверения, а затем вызвать веб-API.
В этом руководстве;
- Настройте управляющая программа для использования сведений о регистрации приложения.
- Создайте управляющее приложение, которое получает токен от собственного имени и вызывает защищенный веб-API.
Необходимые компоненты
Создание приложения управляющей программы .NET
Откройте терминал и перейдите в папку, в которой хотите жить проект.
Инициализируйте консольное приложение .NET и перейдите в корневую папку.
dotnet new console -n ToDoListClient cd ToDoListClient
Установка пакетов
Установка 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": "https://<Enter_the_Tenant_Subdomain_Here>.ciamlogin.com/", "ClientId": "<Enter_the_Application_Id_here>", "ClientCredentials": [ { "SourceType": "ClientSecret", "ClientSecret": "<Enter_the_Client_Secret_Here>" } ] }, "DownstreamApi": { "BaseUrl": "<Web_API_base_url>", "RelativePath": "api/todolist", "RequestAppToken": true, "Scopes": [ "api://<Enter_the_Web_Api_Application_Id_Here>/.default" ] } }
Замените следующие значения собственными:
значение Описание Enter_the_Application_Id_Here Идентификатор приложения (клиента) зарегистрированного приложения управляющей программы клиента. Enter_the_Tenant_Subdomain_Here Поддомен каталога (клиента). Enter_the_Client_Secret_Here Созданное вами значение секрета приложения управляющей программы. Enter_the_Web_Api_Application_Id_Here Идентификатор приложения (клиента) зарегистрированного веб-приложения API. Web_API_base_url Базовый URL-адрес веб-API. Например, https://localhost:44351/
где 44351 — это номер порта порта, на котором выполняется API. API уже должен выполняться и ожидать запросов на этом этапе, чтобы получить это значение.
Добавление моделей
Перейдите в корневой каталог папки проекта и создайте папку models . В папке моделей создайте файл ToDo.cs и добавьте следующий код:
using System;
namespace ToDoListClient.Models;
public class ToDo
{
public int Id { get; set; }
public Guid Owner { get; set; }
public string Description { get; set; } = string.Empty;
}
Получение маркера доступа
Теперь вы настроили необходимые элементы для приложения управляющей программы. На этом шаге вы напишете код, позволяющий приложению управляющей программы получить маркер доступа.
Откройте файл program.cs в редакторе кода и удалите его содержимое.
Добавьте пакеты в файл.
using Microsoft.Extensions.DependencyInjection; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Web; using ToDoListClient.Models;
Создайте экземпляр получения маркера.
GetDefaultInstance
Используйте методTokenAcquirerFactory
класса пакета для создания экземпляра получения маркераMicrosoft.Identity.Web
. По умолчанию экземпляр считывает файл appsettings.json , если он существует в той же папке, что и приложение.GetDefaultInstance
также позволяет добавлять службы в коллекцию служб.Добавьте эту строку кода в файл program.cs :
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
Настройте параметры приложения для чтения из конфигурации и добавления
DownstreamApi
службы. СлужбаDownstreamApi
предоставляет интерфейс, используемый для вызова нижестоящего API. Мы вызываем эту службу DownstreamAPI в объекте конфигурации. Приложение управляющей программы считывает конфигурации нижестоящего API из раздела DownstreamApi appsettings.json. По умолчанию вы получаете кэш маркеров в памяти.Добавьте следующий фрагмент кода в файл program.cs :
const string ServiceName = "DownstreamApi"; tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName, tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
Создайте средство получения маркера. Это создает все службы, добавленные в службы, и возвращает поставщика услуг. Используйте этот поставщик услуг, чтобы получить доступ к добавленным ресурсу API. В этом случае вы добавили только один ресурс API в качестве подчиненной службы, к которой вы хотите получить доступ.
Добавьте следующий фрагмент кода в файл program.cs :
var serviceProvider = tokenAcquirerFactory.Build();
Вызов веб-API
Добавьте код для вызова защищенного веб-API с помощью IDownstreamApi
интерфейса. В этом руководстве вы реализуете только вызов todo и другой, чтобы получить все додосы. См. другие реализации, такие как Delete и Put в примере кода.
Добавьте эту строку кода в файл program.cs :
var toDoApiClient = serviceProvider.GetRequiredService<IDownstreamApi>();
Console.WriteLine("Posting a to-do...");
var firstNewToDo = await toDoApiClient.PostForAppAsync<ToDo, ToDo>(
ServiceName,
new ToDo()
{
Owner = Guid.NewGuid(),
Description = "Bake bread"
});
await DisplayToDosFromServer();
async Task DisplayToDosFromServer()
{
Console.WriteLine("Retrieving to-do's from server...");
var toDos = await toDoApiClient!.GetForAppAsync<IEnumerable<ToDo>>(
ServiceName,
options => options.RelativePath = "/api/todolist"
);
if (!toDos!.Any())
{
Console.WriteLine("There are no to-do's in server");
return;
}
Console.WriteLine("To-do data:");
foreach (var toDo in toDos!) {
DisplayToDo(toDo);
}
}
void DisplayToDo(ToDo toDo) {
Console.WriteLine($"ID: {toDo.Id}");
Console.WriteLine($"User ID: {toDo.Owner}");
Console.WriteLine($"Message: {toDo.Description}");
}
Запуск клиентского приложения управляющей программы
Перейдите в корневую папку приложения управляющей программы и выполните следующую команду:
dotnet run
Если все в порядке, вы увидите следующие выходные данные в терминале.
Posting a to-do...
Retrieving to-do's from server...
To-do data:
ID: 1
User ID: 00aa00aa-bb11-cc22-dd33-44ee44ee44ee
Message: Bake bread
Устранение неполадок
В случае возникновения ошибок
- Подтвердите сведения о регистрации, добавленные в файл appsettings.json.
- Убедитесь, что вы вызываете веб-API через правильный порт и по протоколу https.
- Убедитесь, что разрешения приложения настроены правильно.
Полный пример кода можно найти на сайте GitHub.
Очистка ресурсов
Если вы не планируете использовать приложения, зарегистрированные и созданные в этом руководстве, удалите их, чтобы избежать затрат.