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.
En este inicio rápido, protegerá una API web de ASP.NET Core con Microsoft Entra ID mediante Microsoft. Identity.Web. Agregue middleware de autenticación que valide los tokens portador y restrinja el acceso a las llamadas autorizadas.
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Prerrequisitos
- SDK de .NET 9
- Un inquilino de Microsoft Entra ID. Si no tiene una, cree una cuenta gratuita.
- Un registro de aplicación para la API
Opción 1: Crear a partir de una plantilla (más rápida)
Utiliza la plantilla de ASP.NET Core con autenticación Microsoft Entra integrada para crear un proyecto de API protegido.
1. Creación del proyecto
Ejecute los siguientes comandos para crear un nuevo proyecto de API web con autenticación de una sola organización y vaya al directorio del proyecto:
dotnet new webapi --auth SingleOrg --name MyWebApi
cd MyWebApi
2. Configurar el registro de aplicaciones
Reemplaza los valores de marcador de posición en appsettings.json con los detalles de registro de tu aplicación de Microsoft Entra:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-api-client-id"
}
}
3. Ejecución de la API
Inicie la aplicación:
dotnet run
La API ahora está protegida en https://localhost:5001.
¡Listo! Las solicitudes ahora requieren un token de acceso válido.
Opción 2: Agregar a la API web existente
Si ya tiene una API web de ASP.NET Core, agregue Microsoft Entra autenticación con los pasos siguientes.
1. Instalación del paquete NuGet
Agregue el paquete Microsoft.Identity.Web de NuGet a su proyecto.
dotnet add package Microsoft.Identity.Web
2. Configurar la autenticación en Program.cs
Registre los servicios de autenticación y autorización en la canalización de inicio de la aplicación. El siguiente código configura la autenticación del portador JWT con la validación de Microsoft Entra:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
var builder = WebApplication.CreateBuilder(args);
// Add authentication
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration, "AzureAd");
// Add authorization
builder.Services.AddAuthorization();
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthentication(); // Add authentication middleware
app.UseAuthorization();
app.MapControllers();
app.Run();
3. Agregar configuración a appsettings.json
Agregue la sección de configuración de Microsoft Entra con los detalles de su inquilino y su aplicación. Establezca el nivel de registro de Microsoft.Identity.Web en Information para ayudar a solucionar problemas de validación de tokens:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-api-client-id"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Identity.Web": "Information"
}
}
}
4. Protección de los puntos de conexión de API
Aplique el [Authorize] atributo a controladores o acciones que requieren un token de acceso válido.
Requerir autenticación para todos los puntos de conexión:
El controlador siguiente requiere un token de acceso válido para todas las acciones y muestra cómo acceder a las notificaciones de usuario:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Authorize] // Require valid access token
[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
// Access user information
var userId = User.FindFirst("oid")?.Value;
var userName = User.Identity?.Name;
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = "Protected data"
});
}
}
Requerir ámbitos específicos:
Use el [RequiredScope] atributo para aplicar permisos específicos en acciones individuales:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Identity.Web;
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class TodoController : ControllerBase
{
[HttpGet]
[RequiredScope("access_as_user")] // Require specific scope
public IActionResult GetAll()
{
return Ok(new[] { "Todo 1", "Todo 2" });
}
[HttpPost]
[RequiredScope("write")] // Different scope for write operations
public IActionResult Create([FromBody] string item)
{
return Created("", item);
}
}
5. Ejecutar y probar
Inicie la aplicación y compruebe que se rechazan las solicitudes no autenticadas:
dotnet run
Pruebe utilizando una herramienta como Postman o curl. Una solicitud no autenticada devuelve 401 Unauthorized:
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" https://localhost:5001/api/weatherforecast
¡Éxito! La API ahora valida los tokens de portador.
Configuración del registro de aplicaciones
Para que la API pueda validar tokens, necesita un registro de aplicación Microsoft Entra. Siga estos pasos en el portal de Azure.
1. Registrar la API
- Inicie sesión en el portal Azure
- Vaya a Microsoft Entra ID>Registros de aplicaciones>Nuevo registro
- Escriba un nombre (por ejemplo, "Mi API web")
- Seleccione Inquilino único (más común para las API)
- No se necesita ningún URI de redirección para las API
- Haga clic en Registrar.
Exponer un ámbito de API
Defina los permisos (ámbitos) que las aplicaciones cliente pueden solicitar al llamar a la API.
- En el registro de la aplicación de API, vaya a Exponer una API.
- Haga clic en Agregar un ámbito.
- Acepte el URI de identificador de aplicación predeterminado o personalícelo (por ejemplo,
api://your-api-client-id) - Agregue un ámbito:
-
Nombre del ámbito:
access_as_user - Quién puede dar su consentimiento: Administradores y usuarios
- Nombre para mostrar del consentimiento del administrador: "Access My Web API" (Acceso a Mi API web)
- Descripción del consentimiento del administrador: "Permite que la aplicación acceda a la API web en nombre del usuario que ha iniciado sesión"
-
Nombre del ámbito:
- Haga clic en Agregar ámbito.
3. Anote el identificador de la aplicación
Copie el identificador de aplicación (cliente) de la página de información general del registro de aplicaciones. Este valor es tu ClientId en appsettings.json.
Creación de un registro de aplicaciones cliente (para pruebas)
Para probar la API protegida, registre una aplicación cliente independiente que adquiera tokens y llame a la API.
1. Registrar una aplicación cliente
- En Microsoft Entra ID>Registros de aplicaciones, cree otro registro.
- Asígnelo el nombre (por ejemplo, "Mi cliente de API")
- Selección de tipos de cuenta
- Agregar URI de redirección:
https://localhost:7000/signin-oidc(si se trata de una aplicación web) - Haga clic en Registrar.
2. Concesión de permisos de API
Conceda permiso a la aplicación cliente para llamar a la API con los ámbitos definidos.
- En el registro de aplicaciones cliente, vaya a Permisos de API.
- Haga clic en Agregar un permiso>Mis API.
- Selección del registro de API
- Comprueba el
access_as_userámbito - Haga clic en Agregar permisos.
- Haga clic en Conceder consentimiento del administrador (si es necesario)
3. Crear un secreto de cliente (para clientes confidenciales)
Si la aplicación cliente se ejecuta en un servidor (no en un explorador o dispositivo móvil), cree un secreto de cliente para la autenticación.
- Vaya a Certificados y secretos
- Haga clic en Nuevo secreto de cliente.
- Agregar una descripción y una expiración
- Haga clic en Agregar.
- Copie el valor secreto inmediatamente: usted no podrá verlo de nuevo.
Prueba de la API protegida
Compruebe que la API valida correctamente los tokens mediante el envío de solicitudes autenticadas.
Uso de Postman
Configure la autenticación de OAuth 2.0 en Postman para adquirir un token y llamar a la API.
- Creación de una nueva solicitud en Postman
- Configuración de la autenticación de OAuth 2.0:
- Tipo de concesión: Código de autorización (para contexto de usuario) o Credenciales de cliente (para el contexto de la aplicación)
-
Dirección URL de autenticación:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize -
Dirección URL del token de acceso:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token - Id. de cliente: Identificador de cliente de la aplicación cliente
- Secreto de cliente: Secreto de la aplicación cliente
-
Alcance:
api://your-api-client-id/access_as_user
- Haga clic en Obtener nuevo token de acceso.
- Uso del token para llamar a la API
Uso de código (ejemplo de C#)
En el ejemplo siguiente se usa MSAL.NET para adquirir un token con el flujo de credenciales de cliente y llamar a la API protegida:
// In a console app or client application
using Microsoft.Identity.Client;
var app = ConfidentialClientApplicationBuilder
.Create("client-app-id")
.WithClientSecret("client-secret")
.WithAuthority("https://login.microsoftonline.com/{tenant-id}")
.Build();
var result = await app.AcquireTokenForClient(
new[] { "api://your-api-client-id/.default" }
).ExecuteAsync();
var accessToken = result.AccessToken;
// Use the token to call your API
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);
var response = await client.GetAsync("https://localhost:5001/api/weatherforecast");
Opciones de configuración comunes
Microsoft. Identity.Web admite varios patrones de configuración para distintos escenarios.
Requerir ámbitos específicos en la configuración
En lugar de usar el [RequiredScope] atributo , puede configurar los ámbitos necesarios globalmente en appsettings.json:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-api-client-id",
"Scopes": "access_as_user"
}
}
Aceptar tokens de varios inquilinos
Para aceptar tokens de cualquier inquilino de Microsoft Entra, establezca TenantId en common:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "common",
"ClientId": "your-api-client-id"
}
}
Configuración de la validación de tokens
Si la API llama a las API de bajada (por ejemplo, Microsoft Graph), habilite la adquisición de tokens y configure una caché de tokens:
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
.EnableTokenAcquisitionToCallDownstreamApi() // If your API calls other APIs
.AddInMemoryTokenCaches();
Pasos siguientes
Ahora que tiene una API protegida, explore estos temas:
- Llamar a las APIs aguas abajo: llame a Microsoft Graph u otras APIs en nombre de los usuarios.
- Configuración de la caché de tokens : estrategias de caché de producción para escenarios de OBO.
- Procesos de ejecución prolongada - Gestionar los trabajos en segundo plano con tokens de OBO.
- Implementar detrás de una pasarela de API: Azure API Management, Azure Front Door, Application Gateway.
Solución de problemas
401 No autorizado
Problema: La API devuelve 401 incluso con un token.
Causas posibles:
- La audiencia del token (
audreclamación) no coincide con la de su API.ClientId - El token ha expirado
- El token es para el arrendatario incorrecto
- Falta el ámbito requerido
Solución: Descodifique el token en jwt.ms y verifique las declaraciones. Consulte Registro y diagnóstico para obtener una solución de problemas detallada.
AADSTS50013: firma no válida
Problema: Se produce un error en la validación de la firma del token.
Solución: Asegúrese de que TenantId y ClientId son correctos. La autoridad esperada debe emitir el token. Habilite el registro detallado para ver los errores de validación.
Ámbitos no encontrados en el token
Problema:[RequiredScope] se produce un error en el atributo .
Solution:
- Verifica que la aplicación del cliente tenga permiso para el ámbito
- Asegúrese de que se concedió el consentimiento del administrador (si es necesario)
- Consulte la Guía de autorización para obtener patrones de validación de ámbito completo.
- Compruebe que el ámbito se solicita cuando se adquiera el token (por ejemplo,
api://your-api/.defaulto ámbitos específicos).
Consulte más:Guía de solución de problemas de API web
Contenido relacionado
- Guía de autorización : atributo RequiredScope, directivas de autorización, filtrado de inquilinos
- Guía de personalización : configuración de opciones de portador de JWT y parámetros de validación
- Registro y diagnóstico - Solucionar problemas de autenticación con IDs de correlación
- Tutorial de API web protegida
- ejemplos de API