Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:
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.
¿Olvidó proporcionar el consentimiento del administrador? Las aplicaciones daemon 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 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_Herepor el identificador de inquilino o el nombre del inquilino (por ejemplo,contoso.microsoft.com). -
Enter_the_Application_Id_Herees 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.