Adquisición de tokens para llamar a una API web mediante una aplicación de demonio

Después de que se ha construido una aplicación cliente confidencial, puede llamar a AcquireTokenForClient y pasar el ámbito y, opcionalmente, forzar una actualización del token para adquirir un token para la aplicación.

Solicitud de ámbitos

El ámbito que va a solicitar para un flujo de credenciales de cliente es el nombre del recurso seguido de /.default. Esta notación indica a Microsoft Entra ID que use los permisos de nivel de aplicación declarados estáticamente durante el registro de la aplicación. Además, un administrador de inquilinos debe conceder estos permisos de API.

Este es un ejemplo de definición de los ámbitos de la API web como parte de la configuración en un archivo appsettings.json. Este ejemplo se ha tomado del ejemplo de código del demonio de consola de .NET de GitHub.

{
    "AzureAd": {
        // Same AzureAd section as before.
    },

    "MyWebApi": {
        "BaseUrl": "https://localhost:44372/",
        "RelativePath": "api/TodoList",
        "RequestAppToken": true,
        "Scopes": [ "[Enter here the scopes for your web API]" ]
    }
}

Recursos de Azure AD (v1.0)

El ámbito usado para las credenciales del cliente siempre debe ser el identificador del recurso seguido de /.default.

Importante

Cuando MSAL solicita un token de acceso para un recurso que acepta tokens de acceso de la versión 1.0, Microsoft Entra ID analiza la audiencia deseada del ámbito solicitado, para lo cual toma todo lo que hay antes de la última barra diagonal y lo usa como identificador del recurso. Por tanto si, al igual que Azure SQL Database (https://database.windows.net), el recurso espera una audiencia que finaliza con una barra diagonal (en el caso de Azure SQL Database, https://database.windows.net/), deberá solicitar un ámbito de https://database.windows.net//.default (tenga en cuenta la doble barra diagonal). Consulte también el problema de MSAL.NET 747: Resource url's trailing slash is omitted, which caused sql auth failure.

API AcquireTokenForClient

Para adquirir un token para la aplicación, use AcquireTokenForClient o el equivalente, según la plataforma.

Con Microsoft.Identity.Web, no necesita adquirir un token. Puede usar API de nivel superior, como se ve en Llamada a una API web desde una aplicación de demonio. Sin embargo, si usa un SDK que requiere un token, el siguiente fragmento de código muestra cómo obtener este token.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;

// In the Program.cs, acquire a token for your downstream API

var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
ITokenAcquirer acquirer = tokenAcquirerFactory.GetTokenAcquirer();
AcquireTokenResult tokenResult = await acquirer.GetTokenForUserAsync(new[] { "https://graph.microsoft.com/.default" });
string accessToken = tokenResult.AccessToken;

Protocolo

Si no tiene todavía una biblioteca para el lenguaje elegido, es posible que quiera usar el protocolo directamente:

Primer caso: Acceso a la solicitud de token mediante un secreto compartido

POST /{tenant}/oauth2/v2.0/token HTTP/1.1           //Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=A1b-C2d_E3f.H4i,J5k?L6m!N7o-P8q_R9s.T0u
&grant_type=client_credentials

Segundo caso: Acceso a la solicitud de token mediante un certificado

POST /{tenant}/oauth2/v2.0/token HTTP/1.1               // Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=aaaaaaaa-0b0b-...
&grant_type=client_credentials

Para más información, consulte la documentación del protocolo: La Plataforma de identidad de Microsoft y el flujo de credenciales de cliente de OAuth 2.0

Solución de problemas

¿Ha usado el ámbito de recurso/.default?

Si recibe un mensaje de error que indica que ha usado un ámbito no válido, probablemente no ha usado el ámbito resource/.default.

Si se produce un error No tiene privilegios suficientes para completar la operación al llamar a la API, el administrador de inquilinos debe conceder permisos a la aplicación.

Si no concede consentimiento de administrador a la aplicación, se producirá el siguiente error:

Failed to call the web API: Forbidden
Content: {
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "<guid>",
      "date": "<date>"
    }
  }
}

Seleccione una de las opciones siguientes según el rol.

Administrador de inquilinos global

Si es un administrador de inquilinos global, vaya a Aplicaciones empresariales en el Centro de administración de Microsoft Entra. Seleccione el registro de la aplicación y seleccione Permisos en la sección Seguridad del panel izquierdo. Seleccione el botón grande denominado Conceder consentimiento de administrador para {Tenant Name}, donde {Tenant Name} es el nombre del directorio.

Usuario estándar

Para un usuario estándar del inquilino, pida a un administrador global que dé consentimiento de administrador a la aplicación. Para ello, proporcione la siguiente dirección URL al administrador:

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

En la dirección URL:

  • Reemplace Enter_the_Tenant_Id_Here por el identificador de inquilino o el nombre del inquilino (por ejemplo, contoso.microsoft.com).
  • Enter_the_Application_Id_Here es el identificador (cliente) de la aplicación registrada.

Es posible que después de conceder consentimiento a la aplicación mediante la URL anterior, aparezca el error AADSTS50011: No reply address is registered for the application. Este error se produce porque la aplicación y la dirección URL no tienen un URI de redirección. Esto se puede omitir.

¿Está llamando a su propia API?

Si la aplicación demonio llama a su propia API web y no pudo agregar un permiso de aplicación al registro de aplicaciones del demonio, debe agregar roles de aplicación al registro de aplicaciones de la API web.

Pasos siguientes

Avance al siguiente artículo de este escenario, Llamada a una API web.