Condividi tramite


Esercitazione: Chiamare un'API Web protetta dall'app daemon .NET

Questa esercitazione è la parte finale di una serie che mostra come chiamare un'API Web protetta da un'app daemon .NET. Nella prima parte di questa serieè stato preparato il tenant esterno per autorizzare un'app daemon .NET. In questa esercitazione verrà compilata l'app daemon client e verrà chiamata un'API Web protetta. L’app daemon client verrà abilitata per acquisire un token di accesso usando la propria identità e verrà quindi chiamata l'API Web.

Contenuto dell'esercitazione:

  • Configurare un'app daemon per l'uso dei dettagli di registrazione delle app.
  • Creare un'app daemon che acquisisce un token per proprio conto e chiama un'API Web protetta.

Prerequisiti

Creare un'app daemon .NET

  1. Aprire il terminale e passare alla cartella in cui si desidera che il progetto sia attivo.

  2. Inizializzare un'app console .NET e passare alla cartella radice.

    dotnet new console -n ToDoListClient
    cd ToDoListClient
    

Installare i pacchetti

Installare i pacchetti Microsoft.Identity.Web e Microsoft.Identity.Web.DownstreamApi:

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

Microsoft.Identity.Web fornisce l'associazione tra ASP.NET Core, il middleware di autenticazione, e Microsoft Authentication Library (MSAL) for .NET, semplificando così l'aggiunta di funzionalità di autenticazione e autorizzazione per l'app. Microsoft.Identity.Web.DownstreamApi fornisce un'interfaccia usata per chiamare un'API downstream.

Creare un file appsettings.json e aggiungere configurazioni di registrazione

  1. Creare il file appsettings.json nella cartella radice dell'app.

  2. Aggiungere i dettagli di registrazione dell'app al file 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"
            ]
        }
    }
    

    Sostituire i valori seguenti con valori personalizzati:

    Valore Descrizione
    Enter_the_Application_Id_Here ID applicazione (client) dell'app daemon client registrata.
    Enter_the_Tenant_Subdomain_Here Sottodominio della directory (tenant).
    Enter_the_Client_Secret_Here Valore del segreto dell'app daemon creato.
    Enter_the_Web_Api_Application_Id_Here ID applicazione (client) dell'app per l’API Web registrata.
    Web_API_base_url URL di base dell'API Web. Ad esempio, https://localhost:44351/ dove 44351 è il numero di porta della porta in cui è in esecuzione l'API. Per ottenere questo valore è necessario che in questa fase l'API sia già in esecuzione e in attesa di richieste.

Aggiungi modelli

Passare alla radice della cartella del progetto e creare una cartella models. Nella cartella models creare un file ToDo.cs e aggiungere il codice seguente:

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

Acquisire il token di accesso

Sono stati ora configurati gli elementi necessari per l'applicazione daemon. In questo passaggio viene scritto il codice che consente all'app daemon di acquisire un token di accesso.

  1. Aprire il file program.cs nell'editor di codice ed eliminarlo.

  2. Aggiungere i pacchetti al file.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    using ToDoListClient.Models;
    
  3. Creare l'istanza di acquisizione del token. Usare il metodo GetDefaultInstance della classe TokenAcquirerFactory del pacchetto Microsoft.Identity.Web per compilare l'istanza di acquisizione del token. Per impostazione predefinita, l'istanza legge un file appsettings.json se è presente nella stessa cartella dell'app. GetDefaultInstance consente anche di aggiungere servizi alla raccolta di servizi.

    Aggiungere questa riga di codice al file program.cs:

    var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
    
  4. Configurare le opzioni dell'applicazione da leggere dalla configurazione e aggiungere il servizio DownstreamApi. Il servizio DownstreamApi fornisce un'interfaccia usata per chiamare un'API downstream. Questo servizio viene chiamato DownstreamAPI nell'oggetto config. L'app daemon legge le configurazioni dell'API downstream dalla sezione DownstreamApi di appsettings.json. Per impostazione predefinita, si ottiene una cache dei token in memoria.

    Aggiungere l'esempio di codice seguente al file program.cs:

    const string ServiceName = "DownstreamApi";
    
    tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName,
        tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
    
    
  5. Compilare l'acquirer del token. Questo comando compone tutti i servizi aggiunti a Servizi e restituisce un provider di servizi. Usare questo provider di servizi per ottenere l'accesso alla risorsa API aggiunta. In questo caso, è stata aggiunta una sola risorsa API come servizio downstream a cui si vuole accedere.

    Aggiungere l'esempio di codice seguente al file program.cs:

    var serviceProvider = tokenAcquirerFactory.Build();
    

Chiamare l'API Web

Aggiungere codice per chiamare l'API Web protetta tramite l'interfaccia di IDownstreamApi. In questa esercitazione è stata implementata una sola chiamata a Post a todo e un'altra a Get all todos. Vedere le altre implementazioni, ad esempio Delete e Put, nel codice di esempio.

Aggiungere questa riga di codice al file 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}");
}

Eseguire l'app daemon client

Passare alla cartella radice dell'app daemon ed eseguire il comando seguente:

dotnet run

Se tutto è corretto, il terminale visualizza in genere l'output seguente.

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

Risoluzione dei problemi

In caso di errori:

  • Verificare i dettagli di registrazione aggiunti al file appsettings.json.
  • Verificare che l'API Web venga chiamata tramite la porta corretta e HTTPS.
  • Verificare che le autorizzazioni dell'app siano configurate correttamente.

Il codice di esempio completo è disponibile su GitHub.

Pulire le risorse

Se non si prevede di usare le app registrate e create in questa esercitazione, eliminarle per evitare possibili spese.

Vedi anche