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
.
¿Olvidó proporcionar el consentimiento del administrador? Las aplicaciones de demonio lo necesitan.
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 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 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.