Kurz: Volání chráněného webového rozhraní API z aplikace démona .NET

Tento kurz je poslední částí série, která ukazuje, jak volat chráněné webové rozhraní API z aplikace démona .NET. V první části této série jste připravili externího tenanta na autorizaci aplikace démona .NET. V tomto kurzu sestavíte klientskou aplikaci démona a zavoláte chráněné webové rozhraní API. Aplikaci démon klienta povolíte, aby získala přístupový token pomocí vlastní identity a pak volala webové rozhraní API.

V tomto kurzu;

  • Nakonfigurujte aplikaci démona tak, aby používala podrobnosti o registraci aplikace.
  • Vytvořte aplikaci démona, která získá token vlastním jménem a zavolá chráněné webové rozhraní API.

Požadavky

Vytvoření aplikace démona .NET

  1. Otevřete terminál a přejděte do složky, ve které má projekt žít.

  2. Inicializujte konzolovou aplikaci .NET a přejděte do její kořenové složky.

    dotnet new console -n ToDoListClient
    cd ToDoListClient
    

Instalace balíčků

Instalace Microsoft.Identity.Web a Microsoft.Identity.Web.DownstreamApi balíčky:

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

Microsoft.Identity.Web poskytuje připevnění mezi ASP.NET Core, middlewarem ověřování a knihovnou MSAL (Microsoft Authentication Library) pro .NET, což usnadňuje přidávání možností ověřování a autorizace do aplikace. Microsoft.Identity.Web.DownstreamApi poskytuje rozhraní sloužící k volání podřízeného rozhraní API.

Vytvoření souboru appsettings.json přidání konfigurací registrace

  1. Vytvořte soubor appsettings.json v kořenové složce aplikace.

  2. Do souboru appsettings.json přidejte podrobnosti o registraci aplikace.

    {
        "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"
            ]
        }
    }
    

    Nahraďte následující hodnoty vlastními hodnotami:

    Hodnota Popis
    Enter_the_Application_Id_Here ID aplikace (klienta) aplikace démon klienta, kterou jste zaregistrovali.
    Enter_the_Tenant_Subdomain_Here Subdoména adresáře (tenanta).
    Enter_the_Client_Secret_Here Hodnota tajného kódu aplikace démona, kterou jste vytvořili.
    Enter_the_Web_Api_Application_Id_Here ID aplikace (klienta) aplikace webového rozhraní API, kterou jste zaregistrovali.
    Web_API_base_url Základní adresa URL webového rozhraní API. Například když https://localhost:44351/ 44351 je číslo portu, na kterém vaše rozhraní API běží. Vaše rozhraní API by už mělo být spuštěné a čeká na žádosti v této fázi, abyste získali tuto hodnotu.

Přidání modelů

Přejděte do kořenové složky projektu a vytvořte složku modelů . Ve složce models vytvořte soubor ToDo.cs a přidejte následující kód:

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

Získání přístupového tokenu

Právě jste nakonfigurovali požadované položky pro aplikaci démona. V tomto kroku napíšete kód, který aplikaci démona umožní získat přístupový token.

  1. Otevřete soubor program.cs v editoru kódu a odstraňte jeho obsah.

  2. Přidejte do souboru balíčky.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    using ToDoListClient.Models;
    
  3. Vytvořte instanci získání tokenu. GetDefaultInstance K sestavení instance získání tokenu použijte metodu TokenAcquirerFactory třídy Microsoft.Identity.Web balíčku. Ve výchozím nastavení instance načte soubor appsettings.json , pokud existuje ve stejné složce jako aplikace. GetDefaultInstance také nám umožňuje přidávat služby do kolekce služeb.

    Do souboru program.cs přidejte tento řádek kódu:

    var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
    
  4. Nakonfigurujte možnosti aplikace, které se mají číst z konfigurace, a přidejte DownstreamApi službu. Služba DownstreamApi poskytuje rozhraní, které slouží k volání podřízeného rozhraní API. Tuto službu v objektu konfigurace nazýváme DownstreamAPI . Aplikace démona načte konfigurace podřízeného rozhraní API z části DownstreamApi appsettings.json. Ve výchozím nastavení získáte mezipaměť tokenů v paměti.

    Do souboru program.cs přidejte následující fragment kódu:

    const string ServiceName = "DownstreamApi";
    
    tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName,
        tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
    
    
  5. Sestavte získání tokenu. Tím se vytvoří všechny služby, které jste přidali do služeb, a vrátí poskytovatele služeb. Pomocí tohoto poskytovatele služeb získáte přístup k přidanému prostředku rozhraní API. V tomto případě jste jako podřízenou službu přidali pouze jeden prostředek rozhraní API, ke kterému chcete získat přístup.

    Do souboru program.cs přidejte následující fragment kódu:

    var serviceProvider = tokenAcquirerFactory.Build();
    

Volání webového rozhraní API

Přidejte kód pro volání chráněného webového IDownstreamApi rozhraní API pomocí rozhraní. V tomto kurzu implementujete pouze volání Post a další, abyste získali všechny todo. Podívejte se na další implementace, jako je Delete a Put v ukázkovém kódu.

Do souboru program.cs přidejte tento řádek kódu:

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

Spuštění aplikace démona klienta

Přejděte do kořenové složky aplikace démon a spusťte následující příkaz:

dotnet run

Pokud je všechno v pořádku, měl by se v terminálu zobrazit následující výstup.

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

Odstraňování potíží

V případě, že narazíte na chyby,

  • Potvrďte podrobnosti registrace, které jste přidali do souboru appsettings.json.
  • Ověřte, že voláte webové rozhraní API přes správný port a přes https.
  • Ověřte, že máte správně nakonfigurovaná oprávnění aplikace.

Úplný ukázkový kód je k dispozici na GitHubu.

Vyčištění prostředků

Pokud nemáte v úmyslu používat aplikace, které jste zaregistrovali a vytvořili v tomto kurzu, odstraňte je, abyste se vyhnuli vzniku jakýchkoli nákladů.

Viz také