Adquirir tokens para llamar a una API web mediante una aplicación daemon

Se aplica a: Círculo verde con un símbolo de marca de verificación blanca que indica que el siguiente contenido se aplica a los inquilinos de la fuerza laboral. Inquilinos de la fuerza laboral (más información)

Adquisición de un token para una aplicación cliente confidencial

Las aplicaciones daemon y otras aplicaciones cliente confidenciales que se ejecutan sin interacción del usuario utilizan el flujo de credenciales de cliente de OAuth 2.0 para obtener tokens de acceso exclusivos de la aplicación. En este artículo se explica cómo configurar los ámbitos necesarios, llamar a la AcquireTokenForClient API (o su equivalente de plataforma) para adquirir un token y solucionar errores comunes. Antes de continuar, asegúrese de que ya ha creado una aplicación cliente confidencial.

Ámbitos que solicitar

El ámbito que va a solicitar para un flujo de credenciales de cliente es el nombre del recurso seguido de /.default. La /.default notación indica a Microsoft Entra ID usar 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 un token de acceso de la versión 1.0, Microsoft Entra ID extrae la audiencia deseada del ámbito solicitado tomando todo lo que aparece antes de la última barra diagonal y usándolo como identificador del recurso. Por lo tanto, si, al igual que Azure SQL Database (https://database.windows.net), el recurso espera una audiencia que termina con una barra diagonal (para Azure SQL Database, https://database.windows.net/), debe solicitar un ámbito de https://database.windows.net//.default. (Anote la barra diagonal doble.) Consulte también el problema de MSAL.NET 747: Resource url's trailing slash is omitted, which caused sql auth failure.

API de AcquireTokenForClient

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

Con Microsoft. Identity.Web, no es necesario adquirir un token directamente. Puede usar API de nivel superior, como puede ver en Llamada a una API web desde una aplicación daemon. Sin embargo, si usa un SDK que requiere un token, puede obtener un token de aplicación a través de la ITokenAcquirer abstracción, como se muestra en el ejemplo siguiente:

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 scope resource/.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 del administrador a la aplicación, la API devuelve una respuesta de error similar al ejemplo siguiente:

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 aplicaciones en la nube

Si eres un Administrador de aplicaciones en la nube, ve a Aplicaciones empresariales en el Centro de administración 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, pide a un Administrador de aplicaciones en la nube que dé consentimiento del administrador a la aplicación. Para solicitar consentimiento, dirija al administrador a la siguiente dirección URL del punto de conexión de consentimiento del 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 de aplicación (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. El AADSTS50011 error se produce porque la aplicación y la dirección URL no tienen un URI de redirección. Puede omitir este error de forma segura.

¿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

Continúe con el siguiente artículo en este escenario, Llamar a una API web.