Share via


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

  1. Open de terminal en navigeer naar de map waarin u het project wilt opslaan.

  2. 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

  1. Maak appsettings.json bestand in de hoofdmap van de app.

  2. 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.

  1. Open het program.cs-bestand in de code-editor en verwijder de inhoud ervan.

  2. Voeg uw pakketten toe aan het bestand.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    using ToDoListClient.Models;
    
  3. Maak het exemplaar van het ophalen van tokens. Gebruik de GetDefaultInstance methode van de klasse van Microsoft.Identity.Web het TokenAcquirerFactory 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();
    
  4. Configureer de toepassingsopties die moeten worden gelezen uit de configuratie en voeg de DownstreamApi service toe. De DownstreamApi 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"));
    
    
  5. 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: 00001111-aaaa-2222-bbbb-3333cccc4444

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.

Zie ook