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


Руководство. Вызов защищенного веб-API из приложения управляющей программы .NET

В этом руководстве представлена последняя часть серии, демонстрирующая вызов защищенного веб-API из приложения управляющей программы .NET. В части 1 этой серии вы подготовили внешний клиент для авторизации приложения управляющей программы .NET. В этом руководстве вы создадите клиентское приложение управляющей программы и вызовите защищенный веб-API. Приложение управляющей программы клиента позволяет получить маркер доступа с помощью собственного удостоверения, а затем вызвать веб-API.

В этом руководстве;

  • Настройте управляющая программа для использования сведений о регистрации приложения.
  • Создайте управляющее приложение, которое получает токен от собственного имени и вызывает защищенный веб-API.

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

Создание приложения управляющей программы .NET

  1. Откройте терминал и перейдите в папку, в которой хотите жить проект.

  2. Инициализируйте консольное приложение .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 добавление конфигураций регистрации

  1. Создайте файл appsettings.json в корневой папке приложения.

  2. Добавьте сведения о регистрации приложения в файл 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;
}

Получение маркера доступа

Теперь вы настроили необходимые элементы для приложения управляющей программы. На этом шаге вы напишете код, позволяющий приложению управляющей программы получить маркер доступа.

  1. Откройте файл program.cs в редакторе кода и удалите его содержимое.

  2. Добавьте пакеты в файл.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    using ToDoListClient.Models;
    
  3. Создайте экземпляр получения маркера. GetDefaultInstance Используйте метод TokenAcquirerFactory класса пакета для создания экземпляра получения маркераMicrosoft.Identity.Web. По умолчанию экземпляр считывает файл appsettings.json , если он существует в той же папке, что и приложение. GetDefaultInstance также позволяет добавлять службы в коллекцию служб.

    Добавьте эту строку кода в файл program.cs :

    var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
    
  4. Настройте параметры приложения для чтения из конфигурации и добавления DownstreamApi службы. Служба DownstreamApi предоставляет интерфейс, используемый для вызова нижестоящего API. Мы вызываем эту службу DownstreamAPI в объекте конфигурации. Приложение управляющей программы считывает конфигурации нижестоящего API из раздела DownstreamApi appsettings.json. По умолчанию вы получаете кэш маркеров в памяти.

    Добавьте следующий фрагмент кода в файл program.cs :

    const string ServiceName = "DownstreamApi";
    
    tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName,
        tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
    
    
  5. Создайте средство получения маркера. Это создает все службы, добавленные в службы, и возвращает поставщика услуг. Используйте этот поставщик услуг, чтобы получить доступ к добавленным ресурсу 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: 00001111-aaaa-2222-bbbb-3333cccc4444

Message: Bake bread

Устранение неполадок

В случае возникновения ошибок

  • Подтвердите сведения о регистрации, добавленные в файл appsettings.json.
  • Убедитесь, что вы вызываете веб-API через правильный порт и по протоколу https.
  • Убедитесь, что разрешения приложения настроены правильно.

Полный пример кода можно найти на сайте GitHub.

Очистка ресурсов

Если вы не планируете использовать приложения, зарегистрированные и созданные в этом руководстве, удалите их, чтобы избежать затрат.

См. также