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
Otwórz terminal i przejdź do folderu, w którym ma działać projekt.
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
Utwórz plik appsettings.json w folderze głównym aplikacji.
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.
Otwórz plik program.cs w edytorze kodu i usuń jego zawartość.
Dodaj pakiety do pliku.
using Microsoft.Extensions.DependencyInjection; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Web; using ToDoListClient.Models;
Utwórz wystąpienie pozyskiwania tokenu.
GetDefaultInstance
Użyj metodyTokenAcquirerFactory
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();
Skonfiguruj opcje aplikacji do odczytu z konfiguracji i dodaj usługę
DownstreamApi
. UsługaDownstreamApi
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"));
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.