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
Aprire il terminale e passare alla cartella in cui si desidera che il progetto sia attivo.
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
Creare il file appsettings.json nella cartella radice dell'app.
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.
Aprire il file program.cs nell'editor di codice ed eliminarlo.
Aggiungere i pacchetti al file.
using Microsoft.Extensions.DependencyInjection; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Web; using ToDoListClient.Models;
Creare l'istanza di acquisizione del token. Usare il metodo
GetDefaultInstance
della classeTokenAcquirerFactory
del pacchettoMicrosoft.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();
Configurare le opzioni dell'applicazione da leggere dalla configurazione e aggiungere il servizio
DownstreamApi
. Il servizioDownstreamApi
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"));
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.