Zelfstudie: Een beveiligde web-API aanroepen vanuit uw .NET-daemon-app
Deze zelfstudie is het laatste deel van een reeks die laat zien hoe u een beveiligde web-API aanroept vanuit een .NET-daemon-app. In deel 1 van deze reeks hebt u uw externe tenant voorbereid om een .NET-daemon-app te autoriseren. In deze zelfstudie bouwt u uw client-daemon-app en roept u een beveiligde web-API aan. U schakelt de client-daemon-app in om een toegangstoken te verkrijgen met behulp van een eigen identiteit en vervolgens de web-API aan te roepen.
In deze zelfstudie;
- Configureer een daemon-app om de app-registratiegegevens te gebruiken.
- Bouw een daemon-app die namens zichzelf een token verwerft en een beveiligde web-API aanroept.
Vereisten
Een .NET-daemon-app maken
Open de terminal en navigeer naar de map waarin u het project wilt opslaan.
Initialiseer een .NET-console-app en navigeer naar de hoofdmap.
dotnet new console -n ToDoListClient cd ToDoListClient
Pakketten installeren
Installeren Microsoft.Identity.Web
en Microsoft.Identity.Web.DownstreamApi
pakketten:
dotnet add package Microsoft.Identity.Web
dotnet add package Microsoft.Identity.Web.DownstreamApi
Microsoft.Identity.Web
biedt de lijm tussen ASP.NET Core, de verificatie-middleware en de Microsoft Authentication Library (MSAL) voor .NET, zodat u eenvoudiger verificatie- en autorisatiemogelijkheden aan uw app kunt toevoegen. Microsoft.Identity.Web.DownstreamApi
biedt een interface die wordt gebruikt om een downstream-API aan te roepen.
Een registratieconfiguratie toevoegen appsettings.json bestand maken
Maak appsettings.json bestand in de hoofdmap van de app.
Voeg app-registratiegegevens toe aan het appsettings.json-bestand .
{ "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" ] } }
Vervang de volgende waarden door uw eigen waarden:
Weergegeven als Beschrijving Enter_the_Application_Id_Here De toepassings-id (client) van de client-daemon-app die u hebt geregistreerd. Enter_the_Tenant_Subdomain_Here Het subdomein Directory (tenant). Enter_the_Client_Secret_Here De geheime waarde van de daemon-app die u hebt gemaakt. Enter_the_Web_Api_Application_Id_Here De toepassings-id (client) van de web-API-app die u hebt geregistreerd. Web_API_base_url De basis-URL van de web-API. Bijvoorbeeld, https://localhost:44351/
waarbij 44351 het poortnummer is van de poort waarop uw API wordt uitgevoerd. Uw API moet al worden uitgevoerd en wachten op aanvragen voor deze fase om deze waarde te verkrijgen.
Modellen toevoegen
Navigeer naar de hoofdmap van uw projectmap en maak een modelmap . Maak in de map modellen een ToDo.cs bestand en voeg de volgende code toe:
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;
}
Toegangstoken verkrijgen
U hebt nu de vereiste items geconfigureerd voor uw daemon-toepassing. In deze stap schrijft u de code waarmee de daemon-app een toegangstoken kan verkrijgen.
Open het program.cs-bestand in de code-editor en verwijder de inhoud ervan.
Voeg uw pakketten toe aan het bestand.
using Microsoft.Extensions.DependencyInjection; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Web; using ToDoListClient.Models;
Maak het exemplaar van het ophalen van tokens. Gebruik de
GetDefaultInstance
methode van de klasse vanMicrosoft.Identity.Web
hetTokenAcquirerFactory
pakket om het token-aankoopexemplaren te bouwen. Standaard leest het exemplaar een appsettings.json bestand als het zich in dezelfde map bevindt als de app.GetDefaultInstance
Hiermee kunnen we ook services toevoegen aan de serviceverzameling.Voeg deze coderegel toe aan het program.cs-bestand :
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
Configureer de toepassingsopties die moeten worden gelezen uit de configuratie en voeg de
DownstreamApi
service toe. DeDownstreamApi
service biedt een interface die wordt gebruikt om een downstream-API aan te roepen. We noemen deze service DownstreamAPI in het configuratieobject. De daemon-app leest de downstream-API-configuraties uit de sectie DownstreamApi van appsettings.json. Standaard krijgt u een tokencache in het geheugen.Voeg het volgende codefragment toe aan het bestand program.cs :
const string ServiceName = "DownstreamApi"; tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName, tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
Bouw de token-acquirer. Hiermee worden alle services samengesteld die u hebt toegevoegd aan Services en wordt een serviceprovider geretourneerd. Gebruik deze serviceprovider om toegang te krijgen tot de API-resource die u hebt toegevoegd. In dit geval hebt u slechts één API-resource toegevoegd als een downstreamservice waartoe u toegang wilt.
Voeg het volgende codefragment toe aan het bestand program.cs :
var serviceProvider = tokenAcquirerFactory.Build();
De web-API aanroepen
Voeg code toe om uw beveiligde web-API aan te roepen met behulp van de IDownstreamApi
interface. In deze zelfstudie implementeert u alleen een aanroep naar Post a todo en een andere om alle taken op te halen. Bekijk de andere implementaties, zoals Verwijderen en Plaatsen in de voorbeeldcode.
Voeg deze coderegel toe aan het program.cs-bestand :
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}");
}
De client-daemon-app uitvoeren
Navigeer naar de hoofdmap van de daemon-app en voer de volgende opdracht uit:
dotnet run
Als alles in orde is, ziet u de volgende uitvoer in uw terminal.
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
Problemen oplossen
Als er fouten optreden,
- Bevestig de registratiegegevens die u hebt toegevoegd aan het appsettings.json-bestand.
- Controleer of u de web-API aanroept via de juiste poort en via https.
- Controleer of uw app-machtigingen juist zijn geconfigureerd.
De volledige voorbeeldcode is beschikbaar op GitHub.
Resources opschonen
Als u niet van plan bent om de apps te gebruiken die u hebt geregistreerd en gemaakt in deze zelfstudie, verwijdert u deze om kosten te voorkomen.