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.
Esta guía le ayuda a identificar las diferencias entre el SDK de Microsoft Entra para Agent ID y la biblioteca de Microsoft.Identity.Web en proceso para controlar la autenticación en sus aplicaciones. La biblioteca Microsoft.Identity.Web se integra directamente en las aplicaciones de .NET para lograr el máximo rendimiento. El SDK de Microsoft Entra para el identificador del agente se ejecuta como un contenedor independiente y admite cualquier lenguaje de programación a través de las API HTTP. Elegir el enfoque correcto depende de la arquitectura, el lenguaje y el entorno de implementación de la aplicación.
Diferencias arquitectónicas
La diferencia fundamental radica en dónde se ejecuta la lógica de autenticación. Microsoft. Identity.Web se ejecuta dentro del proceso de aplicación. El SDK de Microsoft Entra para la Identificación de Agente opera como un servicio independiente junto a tu aplicación. Esta elección arquitectónica afecta a factores como el flujo de trabajo de desarrollo y la complejidad operativa.
| Aspecto | Microsoft.Identity.Web (In-Process) | sdk de Microsoft Entra para el identificador del agente (fuera de proceso) |
|---|---|---|
| Límite del proceso | Comparte el mismo proceso, memoria y ciclo de vida que la aplicación, lo que permite llamadas de método directo y configuración compartida. | Mantiene el aislamiento completo, la comunicación solo a través de las API HTTP y la administración de sus propios recursos de forma independiente |
| Acoplamiento de idioma | Acopla estrechamente tu estrategia de autenticación a .NET, lo que requiere experiencia en C# y entorno de ejecución .NET en todos los lugares donde se necesite autenticación. | Desacopla la autenticación de la pila de tecnología de la aplicación, exponiendo una interfaz HTTP independiente del lenguaje que funciona igualmente bien con Python, Node.js, Go o cualquier lenguaje compatible con HTTP |
| Modelo de implementación | Implementa como paquetes NuGet insertados en el binario de la aplicación, creando una unidad de implementación monolítica. | Se implementa como una imagen de contenedor independiente, lo que permite el control de versiones independiente, el escalado y las actualizaciones de la lógica de autenticación sin afectar al código de la aplicación. |
Microsoft.Identity.Web (en proceso)
Este fragmento de código muestra cómo Microsoft. Identity.Web se integra directamente en una aplicación de ASP.NET Core:
// Startup configuration
services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("Graph", Configuration.GetSection("DownstreamApis:Graph"))
.AddInMemoryTokenCaches();
// Usage in controller
public class MyController : ControllerBase
{
private readonly IDownstreamApi _downstreamApi;
public MyController(IDownstreamApi downstreamApi)
{
_downstreamApi = downstreamApi;
}
public async Task<ActionResult> GetUserData()
{
var user = await _downstreamApi.GetForUserAsync<User>("Graph",
options => options.RelativePath = "me");
return Ok(user);
}
}
SDK de Microsoft Entra para ID de agente (fuera de proceso)
Este fragmento de código muestra cómo llamar al SDK de Microsoft Entra para el identificador del agente desde una aplicación de Node.js mediante HTTP. La llamada al punto de conexión del SDK maneja la obtención de /DownstreamApi tokens y las llamadas a la API de downstream, incluida la transferencia del token entrante para los flujos de OBO en el Authorization header.
// Configuration
const SidecarUrl = process.env.SIDECAR_URL || "http://localhost:5000";
// Usage in application
async function getUserData(incomingToken: string) {
const response = await fetch(
`${SidecarUrl}/DownstreamApi/Graph?optionsOverride.RelativePath=me`,
{
headers: {
'Authorization': `Bearer ${incomingToken}`
}
}
);
const result = await response.json();
return JSON.parse(result.content);
}
Comparación de características
| Característica | Microsoft. Identity.Web | SDK de Microsoft Entra para el identificador del agente |
|---|---|---|
| Compatibilidad con idiomas | Solo C# o .NET | Cualquier lenguaje (HTTP) |
| Implementación | Biblioteca en proceso | Contenedor independiente |
| Adquisición de tokens | Direct MSAL.NET | A través de la API HTTP |
| Almacenamiento en caché de tokens | En memoria, distribuido | Basado en memoria, sistema distribuido |
| Flujo de OBO | Compatibilidad nativa | A través del punto de conexión HTTP |
| Credenciales de cliente | Compatibilidad nativa | A través del punto de conexión HTTP |
| Identidad administrada | Soporte directo | Soporte directo |
| Identidades del agente | A través de extensiones | Parámetros de consulta |
| Validación de tokens | Middleware | /Validar endpoint |
| API de bajada | IDownstreamApi | Punto de conexión /DownstreamApi |
| Microsoft Graph | Integración del SDK de Graph | A través de DownstreamApi |
| Rendimiento | En proceso (más rápido) | Sobrecarga HTTP |
| Configuración |
appsettings.json y código |
appsettings.json y variables de entorno |
| Depuración | Depuración estándar de .NET | Depuración de contenedores |
| Recarga activa | .NET Recarga activa | Reinicio del contenedor |
| Actualizaciones de paquetes | paquetes de NuGet | Imágenes de contenedor |
| Licencia | MIT | MIT |
Cuándo usar cada enfoque
Decidir entre Microsoft.Identity.Web y el SDK de Microsoft Entra para el ID de agente depende de los requisitos, la arquitectura y la estrategia de implementación de la aplicación. Dependiendo de sus necesidades, un enfoque podría ser más adecuado que el otro. Las siguientes instrucciones pueden ayudarle a tomar una decisión informada.
| Scenario | Microsoft.Identity.Web (In-Process) | SDK de Microsoft Entra para ID del agente (fuera de proceso) |
|---|---|---|
| Pila de aplicaciones | Aplicaciones .NET exclusivamente • API web de ASP.NET Core • ASP.NET Core Web Apps • servicios de .NET de trabajo • Aplicaciones Blazor • Aplicaciones de demonio |
Microservicios de varios lenguajes • servicios de Node.js, Python, Go, Java • Arquitecturas políglotas • Servicios no .NET • Integración de sistemas heredados |
| Requisitos de rendimiento | El rendimiento es crítico • Escenarios de alto rendimiento • Operaciones sensibles a la latencia • Cada milisegundos cuenta |
Puede tolerar la sobrecarga HTTP • ~1-5 ms latencia adicional aceptable • Rendimiento no limitado por cuellos de botella en la autenticación |
| Necesidades de integración | Se requiere una integración profunda • Configuración de MSAL.NET personalizada • Acceso directo a las características de MSAL • Estrategias avanzadas de caché de tokens |
Integración estandarizada • API HTTP suficiente • Patrones de autenticación coherentes entre servicios |
| Experiencia de desarrollo | Desarrollo rápido • Creación rápida de prototipos • Recarga en caliente para el desarrollo • Depuración .NET estándar |
Desarrollo basado en contenedores • Reinicio del contenedor para realizar cambios • Se requiere depuración de contenedores |
| Equipo y arquitectura | Conjunto de un solo idioma • Experiencia en equipo en C#/.NET • No hay requisitos de varios idiomas |
Diversidad tecnológica • Combinación de marcos y lenguajes • Estructura del equipo políglota |
| Modelo de implementación | Implementaciones monolíticas • Implementación de una sola aplicación • Modelos de hospedaje tradicionales |
Implementaciones en contenedores • Entornos de Kubernetes • Configuraciones de Docker Compose • Arquitecturas de malla de servicio |
| Operations | Actualizaciones de autenticación acopladas • Los cambios de autenticación requieren recompilación de aplicaciones • Ciclo de vida compartido con la aplicación |
Ventajas operativas • Escalado independiente de la lógica de autenticación • Separar las actualizaciones de autenticación del código de la aplicación • Supervisión centralizada de la autenticación |
Guía de migración
Migración desde Microsoft. Identity.Web para Microsoft Entra SDK para AgentID
En determinados escenarios, es posible que desee migrar una aplicación de .NET existente que use Microsoft. Identity.Web para aprovechar el SDK de Microsoft Entra para el identificador del agente para la autenticación. Los motivos de la migración podrían incluir la adopción de una arquitectura de varios lenguajes, la estandarización de la autenticación entre servicios o el traslado a un modelo de implementación en contenedores.
Es necesario tener en cuenta y planear cuidadosamente antes de realizar este cambio. En esta sección se proporciona una ruta de migración de alto nivel con ejemplos de código que le ayudarán a realizar la transición de la aplicación.
Precaución
Microsoft no recomienda pasar de Microsoft. Identity.Web en el SDK de Microsoft Entra para AgentID. Si decide realizar este cambio, los ejemplos siguientes muestran conceptos similares en otros lenguajes y marcos.
Paso 1: Implementación del contenedor del SDK
En primer lugar, agregue el contenedor del SDK al pod:
# Before: Single ASP.NET Core container
containers:
- name: app
image: myregistry/myapp:latest
# After: App + Microsoft Entra SDK for AgentID
containers:
- name: app
image: myregistry/myapp:latest
env:
- name: SIDECAR_URL
value: "http://localhost:5000"
- name: sidecar
image: mcr.microsoft.com/entra-sdk/auth-sidecar:1.0.0
env:
- name: AzureAd__TenantId
value: "your-tenant-id"
- name: AzureAd__ClientId
value: "your-client-id"
Paso 2: Migración de la configuración
A continuación, transfiera la configuración de appsettings.json a variables de entorno.
Antes de (appsettings.json)
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-client-id"
},
"DownstreamApis": {
"Graph": {
"BaseUrl": "https://graph.microsoft.com/v1.0",
"Scopes": "User.Read Mail.Read",
"RelativePath": "/me"
}
}
}
Después (Kubernetes ConfigMap/Variables de entorno)
apiVersion: v1
kind: ConfigMap
metadata:
name: sidecar-config
data:
AzureAd__Instance: "https://login.microsoftonline.com/"
AzureAd__TenantId: "your-tenant-id"
AzureAd__ClientId: "your-client-id"
DownstreamApis__Graph__BaseUrl: "https://graph.microsoft.com/v1.0"
DownstreamApis__Graph__Scopes: "User.Read Mail.Read"
DownstreamApis__Graph__RelativePath: "/me"
Paso 3: Actualización del código de la aplicación
Busque todas las instancias de llamadas en proceso a Microsoft.Identity.Web y reemplácelas por llamadas HTTP al SDK de Microsoft Entra para puntos de conexión de ID de agente.
Antes (C# con IDownstreamApi):
public class UserController : ControllerBase
{
private readonly IDownstreamApi _downstreamApi;
public UserController(IDownstreamApi downstreamApi)
{
_downstreamApi = downstreamApi;
}
[HttpGet]
public async Task<ActionResult<User>> GetMe()
{
var user = await _downstreamApi.GetForUserAsync<User>(
"Graph",
options => options.RelativePath = "me"
);
return Ok(user);
}
}
Después (Cualquier lenguaje con el cliente HTTP):
En el fragmento de código siguiente, puede ver llamadas al SDK de Microsoft Entra para el ID del agente usando el punto de conexión de /DownstreamApi para obtener datos de usuario. Se proporcionan ejemplos en C# y TypeScript.
public class UserController : ControllerBase
{
private readonly HttpClient _httpClient;
private readonly string _SidecarUrl;
public UserController(IHttpClientFactory httpClientFactory, IConfiguration config)
{
_httpClient = httpClientFactory.CreateClient();
_SidecarUrl = config["SIDECAR_URL"];
}
[HttpGet]
public async Task<ActionResult<User>> GetMe()
{
var inboundAuthorizationHeader = Request.Headers["Authorization"].ToString();
// this validates the inbound authorization header and calls the downstream API.
// If you don't call a downstream API, Do validate the inbound authorization header
// (calling the /Validate endpoint)
var request = new HttpRequestMessage(
HttpMethod.Get,
$"{_SidecarUrl}/DownstreamApi/Graph?optionsOverride.RelativePath=me"
);
request.Headers.Add("Authorization", inboundAuthorizationHeader);
var response = await _httpClient.SendAsync(request);
var result = await response.Content.ReadFromJsonAsync<SidecarResponse>();
var user = JsonSerializer.Deserialize<User>(result.Content);
return Ok(user);
}
}
TypeScript
Puede implementar la misma lógica en TypeScript de la siguiente manera:
export async function getMe(incomingToken: string): Promise<User> {
const SidecarUrl = process.env.SIDECAR_URL!;
const response = await fetch(
`${SidecarUrl}/DownstreamApi/Graph?optionsOverride.RelativePath=me`,
{
headers: {
'Authorization': incomingToken
}
}
);
const result = await response.json();
return JSON.parse(result.content) as User;
}
Paso 4: Eliminar dependencias de Microsoft.Identity.Web
Después de completar los pasos anteriores, ordene la aplicación quitando los paquetes NuGet para Microsoft. Identity.Web desde el proyecto:
<!-- Remove these from .csproj -->
<PackageReference Include="Microsoft.Identity.Web" Version="..." />
<PackageReference Include="Microsoft.Identity.Web.MicrosoftGraph" Version="..." />
<PackageReference Include="Microsoft.Identity.Web.DownstreamApi" Version="..." />
Si aún quiere validar tokens en la aplicación, no es necesario quitar la configuración de autenticación original. En su lugar, puede delegar la validación por completo en el SDK de Microsoft Entra para AgentID.
// Remove from Program.cs or Startup.cs
services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("Graph", Configuration.GetSection("DownstreamApis:Graph"))
.AddInMemoryTokenCaches();
Paso 5: Probar y validar
- Pruebas unitarias: actualice las pruebas para simular llamadas HTTP al SDK.
- Pruebas de integración: Pruebe la comunicación del SDK en el entorno de preproducción.
- Pruebas de rendimiento: mida el impacto de la sobrecarga HTTP.
- Pruebas de seguridad: valide el control de tokens y las directivas de red.
Consideraciones sobre el rendimiento
Sobrecarga del SDK
El SDK de Microsoft Entra para el identificador del agente presenta una sobrecarga de comunicación HTTP:
| Factor de rendimiento | Impacto | Estrategia de mitigación |
|---|---|---|
| Latencia | Aproximadamente 1 a 5 ms por solicitud para las comunicaciones con localhost | Use HTTP/2 para reducir la sobrecarga de conexión. |
| Rendimiento | Limitado por la agrupación de conexiones HTTP | Implemente la agrupación de conexiones para reutilizar las conexiones HTTP. |
| Memoria | Sobrecarga adicional de memoria del contenedor | Asegúrese de que la asignación de recursos del SDK sea adecuada. |
| Eficiencia de la solicitud | Varios recorridos de ida y vuelta para operaciones complejas | Solicitudes por lotes para combinar varias operaciones siempre que sea posible. |
| Rendimiento del token | Sobrecarga repetida de adquisición de tokens | Aproveche la caché de tokens del SDK para obtener un rendimiento óptimo. |
rendimiento de In-Process
El uso de Microsoft.Identity.Web tiene una sobrecarga mínima, ya que se ejecuta dentro del mismo proceso que la aplicación. Proporciona llamadas de método nativas con latencia microsegunda y memoria de proceso compartida sin limitaciones HTTP. Cuando el rendimiento es crítico, la integración en proceso es la opción óptima. Sin embargo, la flexibilidad y el diseño independiente del lenguaje del SDK de Microsoft Entra para AgentID pueden superar los compromisos de rendimiento en muchos escenarios.
En la tabla siguiente se muestran algunas comparaciones de rendimiento y costos para el uso en proceso y el SDK de Microsoft Entra para el uso del id. de agente (fuera del proceso):
Consideraciones sobre los costos
| Factor de costo | Microsoft.Identity.Web (In-Process) | Microsoft Entra SDK para el identificador del agente (Externo al proceso) |
|---|---|---|
| Proceso | Cpu y memoria adicionales mínimas en el proceso de aplicación | Recursos de contenedor adicionales por pod. |
| Network | Sin sobrecarga adicional | Comunicación mínima en el localhost. |
| Almacenamiento | Tamaño del paquete NuGet (~10 MB) | Almacenamiento de imágenes de contenedor. |
| Administración | Sin sobrecarga adicional | Sobrecarga de orquestación de contenedores. |
Ejemplo de costo
Para 10 réplicas con configuración del SDK de 128 MiB/100m:
| Resource | En proceso | SDK de Microsoft Entra para el identificador del agente |
|---|---|---|
| Memoria | ~0 MB adicionales | 10 × 128 MiB = 1,28 GB |
| CPU | ~0% adicional | 10 × 100m = 1 núcleo |
| Almacenamiento | ~10 MB por implementación | Tamaño de imagen de contenedor por nodo |
Soporte técnico y mantenimiento
| Aspecto | Microsoft. Identity.Web | SDK de Microsoft Entra para el identificador del agente |
|---|---|---|
| Updates | Actualizaciones de paquetes NuGet | Actualizaciones de imagen de contenedor |
| Cambios importantes | A través del versionado de paquetes | Mediante etiquetas de contenedor |
| Correcciones de errores | Integración en tiempo de compilación | Actualizaciones del contenedor en tiempo de ejecución |
| Revisiones de seguridad | Recompilación de la aplicación | Volver a desplegar el contenedor |
| Documentación | Documentos de .NET extensos | Esta documentación |
| Community | Comunidad de .NET grande | Comunidad creciente |
Enfoque híbrido
Puede combinar ambos enfoques dentro de la misma arquitectura. Use Microsoft. Identity.Web para servicios de .NET que requieren un rendimiento máximo y usan el SDK de Microsoft Entra para el identificador de agente para servicios que no son de .NET o cuando se necesitan patrones de autenticación independientes del lenguaje. Esta estrategia híbrida le ayuda a optimizar el rendimiento donde es fundamental al tiempo que mantiene la coherencia y la flexibilidad en todo el ecosistema de servicios.
Una arquitectura de ejemplo es la siguiente:
graph TB
subgraph cluster["Kubernetes Cluster"]
subgraph netpod["<b>.NET API Pod</b>"]
netapi["<b>.NET API</b><br/>(Microsoft.Identity.Web)"]
style netapi fill:#0078d4,stroke:#005a9e,stroke-width:2px,color:#fff
end
subgraph nodepod["<b>Node.js API Pod</b>"]
nodeapi["<b>Node.js API</b>"]
sidecar["<b>Microsoft Entra SDK for AgentID</b>"]
style nodeapi fill:#68a063,stroke:#4a7c45,stroke-width:2px,color:#fff
style sidecar fill:#f2711c,stroke:#d85e10,stroke-width:2px,color:#fff
end
end
style cluster fill:#f0f0f0,stroke:#333,stroke-width:3px
style netpod fill:#e8f4f8,stroke:#0078d4,stroke-width:2px
style nodepod fill:#e8f4e8,stroke:#68a063,stroke-width:2px