Udostępnij za pośrednictwem


Samouczek: wywoływanie chronionego internetowego interfejsu API z poziomu aplikacji demona platformy .NET

Ten samouczek jest ostatnią częścią serii, która pokazuje, jak wywołać chroniony internetowy interfejs API z poziomu aplikacji demona platformy .NET. W części 1 tej serii przygotowano dzierżawę zewnętrzną do autoryzowania aplikacji demona platformy .NET. W tym samouczku utworzysz aplikację demona klienta i wywołasz chroniony internetowy interfejs API. Aplikacja demona klienta umożliwia uzyskanie tokenu dostępu przy użyciu własnej tożsamości, a następnie wywołanie internetowego interfejsu API.

W tym samouczku;

  • Skonfiguruj aplikację demona, aby używała jej szczegółów rejestracji aplikacji.
  • Utwórz aplikację demona, która uzyskuje token we własnym imieniu i wywołuje chroniony internetowy interfejs API.

Wymagania wstępne

Tworzenie aplikacji demona platformy .NET

  1. Otwórz terminal i przejdź do folderu, w którym ma działać projekt.

  2. Zainicjuj aplikację konsolową platformy .NET i przejdź do folderu głównego.

    dotnet new console -n ToDoListClient
    cd ToDoListClient
    

Instalowanie pakietów

Instalowanie Microsoft.Identity.Web i Microsoft.Identity.Web.DownstreamApi pakiety:

dotnet add package Microsoft.Identity.Web
dotnet add package Microsoft.Identity.Web.DownstreamApi

Microsoft.Identity.Web zapewnia klej między platformą ASP.NET Core, oprogramowaniem pośredniczącym uwierzytelniania i biblioteką Microsoft Authentication Library (MSAL) dla platformy .NET, co ułatwia dodawanie funkcji uwierzytelniania i autoryzacji do aplikacji. Microsoft.Identity.Web.DownstreamApi Udostępnia interfejs używany do wywoływania podrzędnego interfejsu API.

Tworzenie pliku appsettings.json dodawanie konfiguracji rejestracji

  1. Utwórz plik appsettings.json w folderze głównym aplikacji.

  2. Dodaj szczegóły rejestracji aplikacji do pliku 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"
            ]
        }
    }
    

    Zastąp następujące wartości własnymi wartościami:

    Wartość Opis
    Enter_the_Application_Id_Here Identyfikator aplikacji (klienta) zarejestrowanej aplikacji demona klienta.
    Enter_the_Tenant_Subdomain_Here Poddomena katalogu (dzierżawy).
    Enter_the_Client_Secret_Here Utworzona wartość wpisu tajnego aplikacji demona.
    Enter_the_Web_Api_Application_Id_Here Identyfikator aplikacji (klienta) zarejestrowanej aplikacji internetowego interfejsu API.
    Web_API_base_url Podstawowy adres URL internetowego interfejsu API. Na przykład https://localhost:44351/ gdzie 44351 jest numerem portu, na którym działa interfejs API. Interfejs API powinien już działać i czekać na żądania na tym etapie, aby uzyskać tę wartość.

Dodawanie modeli

Przejdź do katalogu głównego folderu projektu i utwórz folder models . W folderze models utwórz plik ToDo.cs i dodaj następujący kod:

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;
}

Uzyskiwanie tokenu dostępu

Dla aplikacji demona skonfigurowano teraz wymagane elementy. W tym kroku napiszesz kod, który umożliwia aplikacji demona uzyskanie tokenu dostępu.

  1. Otwórz plik program.cs w edytorze kodu i usuń jego zawartość.

  2. Dodaj pakiety do pliku.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    using ToDoListClient.Models;
    
  3. Utwórz wystąpienie pozyskiwania tokenu. GetDefaultInstance Użyj metody TokenAcquirerFactory klasy pakietu, aby skompilować wystąpienie pozyskiwania tokenuMicrosoft.Identity.Web. Domyślnie wystąpienie odczytuje plik appsettings.json , jeśli istnieje w tym samym folderze co aplikacja. GetDefaultInstance Umożliwia również dodawanie usług do kolekcji usług.

    Dodaj ten wiersz kodu do pliku program.cs :

    var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
    
  4. Skonfiguruj opcje aplikacji do odczytu z konfiguracji i dodaj usługę DownstreamApi . Usługa DownstreamApi udostępnia interfejs używany do wywoływania podrzędnego interfejsu API. Wywołujemy tę usługę DownstreamAPI w obiekcie konfiguracji. Aplikacja demona odczytuje konfiguracje podrzędnego interfejsu API z sekcji DownstreamApi appsettings.json. Domyślnie uzyskuje się pamięć podręczną tokenu w pamięci.

    Dodaj następujący fragment kodu do pliku program.cs :

    const string ServiceName = "DownstreamApi";
    
    tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName,
        tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
    
    
  5. Skompiluj program pozyskiwania tokenów. Spowoduje to utworzenie wszystkich usług dodanych do usług i zwrócenie dostawcy usług. Użyj tego dostawcy usług, aby uzyskać dostęp do dodanego zasobu interfejsu API. W takim przypadku dodano tylko jeden zasób interfejsu API jako usługę podrzędną, do której chcesz uzyskać dostęp.

    Dodaj następujący fragment kodu do pliku program.cs :

    var serviceProvider = tokenAcquirerFactory.Build();
    

Wywoływanie internetowego interfejsu API

Dodaj kod w celu wywołania chronionego internetowego interfejsu API przy użyciu interfejsu IDownstreamApi . W tym samouczku zaimplementujesz wywołanie polecenia Post a todo i innego wywołania, aby pobrać wszystkie zadania do wykonania. Zobacz inne implementacje, takie jak Delete i Put w przykładowym kodzie.

Dodaj ten wiersz kodu do pliku 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}");
}

Uruchamianie aplikacji demona klienta

Przejdź do folderu głównego aplikacji demona i uruchom następujące polecenie:

dotnet run

Jeśli wszystko jest w porządku, w terminalu powinny zostać wyświetlone następujące dane wyjściowe.

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

Rozwiązywanie problemów

W przypadku napotkania błędów,

  • Potwierdź szczegóły rejestracji dodane do pliku appsettings.json.
  • Upewnij się, że wywołujesz internetowy interfejs API za pośrednictwem poprawnego portu i protokołu HTTPS.
  • Upewnij się, że uprawnienia aplikacji są poprawnie skonfigurowane.

Pełny przykładowy kod jest dostępny w witrynie GitHub.

Czyszczenie zasobów

Jeśli nie zamierzasz używać zarejestrowanych i utworzonych w tym samouczku aplikacji, usuń je, aby uniknąć ponoszenia kosztów.

Zobacz też