Compartir vía


Tutorial: llamada a una API web protegida desde la aplicación de demonio de .NET

Este tutorial es la parte final de una serie que muestra cómo llamar a una API web protegida desde una aplicación de demonio de .NET. En parte 1 de esta serie, preparó el inquilino externo para autorizar una aplicación de demonio de .NET. En este tutorial, compilará la aplicación de demonio de cliente y llamará a una API web protegida. Permita que la aplicación de demonio de cliente adquiera un token de acceso con su propia identidad y, luego, llame a la API web.

En este tutorial,

  • Configure una aplicación de demonio para usarla en los detalles del registro de la aplicación.
  • Compile una aplicación de demonio que adquiera un token en su propio nombre y llame a una API web protegida.

Requisitos previos

Creación de aplicaciones de demonio de .NET

  1. Abra el terminal y vaya a la carpeta donde desea tener el proyecto.

  2. Inicialización de una aplicación de consola de .NET y navegación a su carpeta raíz.

    dotnet new console -n ToDoListClient
    cd ToDoListClient
    

Instalar paquetes

Instale los paquetes Microsoft.Identity.Web y Microsoft.Identity.Web.DownstreamApi:

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

Microsoft.Identity.Web proporciona el enlace entre ASP.NET Core, el middleware de autenticación y la Biblioteca de autenticación de Microsoft (MSAL) para .NET, lo que facilita la adición de funcionalidades de autenticación y autorización a la aplicación. Microsoft.Identity.Web.DownstreamApi proporciona una interfaz que se usa para llamar a una API de bajada.

Creación de un archivo appsettings.json y agregar configuraciones de registro

  1. Cree un archivo appsettings.json en la carpeta raíz de la aplicación.

  2. Agregue los detalles del registro de aplicación al archivo 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"
            ]
        }
    }
    

    Reemplace los valores siguientes por los que considere adecuados:

    Value Descripción
    Enter_the_Application_Id_Here La aplicación (cliente) de la aplicación de demonio de cliente que registró.
    Enter_the_Tenant_Subdomain_Here Subdominio Directorio (inquilino).
    Enter_the_Client_Secret_Here Valor del secreto de la aplicación de demonio que ha creado.
    Enter_the_Web_Api_Application_Id_Here Id. de aplicación (cliente) de la aplicación web que registró.
    Web_API_base_url Dirección URL base de la API web. Por ejemplo, https://localhost:44351/ donde 44351 es el número de puerto del puerto en el que se ejecuta la API. La API ya debe estar en ejecución y esperando solicitudes en esta fase para que obtenga este valor.

Agregar modelos

Vaya a la raíz de la carpeta del proyecto y cree una carpeta Modelos. En la carpeta Modelos, cree un archivo ToDo.cs y agregue el código siguiente:

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

Adquirir token de acceso

Ahora ha configurado los elementos necesarios para la aplicación de demonio. En este paso, escribirá el código que permite a la aplicación de demonio adquirir un token de acceso.

  1. Abra el archivo program.cs en el editor de código y elimine su contenido.

  2. Agregue los paquetes al archivo.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    using ToDoListClient.Models;
    
  3. Crear la instancia de adquisición de token. Use el método GetDefaultInstance de la clase TokenAcquirerFactory del paquete Microsoft.Identity.Web para compilar la instancia de adquisición de token. De forma predeterminada, la instancia lee un archivo appsettings.json si existe en la misma carpeta que la aplicación. GetDefaultInstance también nos permite agregar servicios a la colección de servicios.

    Agregue esta línea de código al archivo program.cs:

    var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
    
  4. Configure las opciones de aplicación que se van a leer de la configuración y agregue el servicio de DownstreamApi. El servicio DownstreamApi proporciona una interfaz que se usa para llamar a una API de bajada. Llamamos a este servicio DownstreamAPI en el objeto de configuración. La aplicación de demonio lee las configuraciones de API de bajada de la sección DownstreamApi de appsettings.json. De forma predeterminada, obtendrá una caché de tokens en memoria.

    Agregue el siguiente fragmento de código al archivo program.cs:

    const string ServiceName = "DownstreamApi";
    
    tokenAcquirerFactory.Services.AddDownstreamApi(ServiceName,
        tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
    
    
  5. Compilar el adquiridor de tokens. Esto compone todos los servicios que ha agregado a Servicios y devuelve un proveedor de servicios. Use este proveedor de servicios para obtener acceso al recurso de API que ha agregado. En este caso, ha agregado solo un recurso de API como un servicio de bajada al que desea acceder.

    Agregue el siguiente fragmento de código al archivo program.cs:

    var serviceProvider = tokenAcquirerFactory.Build();
    

Llamada a la API web

Agregue código para llamar a la API web protegida mediante la interfaz de IDownstreamApi. En este tutorial, sólo se implementa una llamada para Publicar una tarea pendiente y otra para Obtener todas las tareas pendientes. Consulte las demás implementaciones, como Delete y Put en el código de ejemplo.

Agregue esta línea de código al archivo 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}");
}

Ejecución de la aplicación de demonio del cliente

Navegue a la carpeta raíz de la aplicación de demonio y ejecute el siguiente comando:

dotnet run

Si todo está bien, debería ver la siguiente salida en el 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

Solución de problemas

En caso de que se produzcan errores,

  • Confirme los detalles de registro que agregó al archivo appsettings.json.
  • Confirme que está llamando a la API web a través del puerto correcto y a través de https.
  • Confirme que los permisos de la aplicación están configurados correctamente.

El código de ejemplo completo está disponible en GitHub.

Limpieza de recursos

Si no tiene previsto usar las aplicaciones que ha registrado y creado en este tutorial, elimínelas para evitar incurrir en costos.

Consulte también