Condividi tramite


Confronto: Microsoft Entra SDK per AgentID contro In-Process Microsoft.Identity.Web

Questa guida consente di identificare le differenze tra Microsoft Entra SDK per AgentID e la libreria Microsoft.Identity.Web in-process per la gestione dell'autenticazione nelle applicazioni. La libreria Microsoft.Identity.Web si integra direttamente nelle applicazioni .NET per ottenere prestazioni massime, mentre Microsoft Entra SDK per AgentID viene eseguito come contenitore separato e supporta qualsiasi linguaggio di programmazione tramite API HTTP e la scelta dell'approccio corretto dipende dall'architettura, dal linguaggio e dall'ambiente di distribuzione dell'applicazione.

Differenze architetturali

La differenza fondamentale risiede nella posizione in cui viene eseguita la logica di autenticazione. Microsoft.Identity.Web viene eseguito all'interno del processo dell'applicazione, mentre Microsoft Entra SDK per AgentID opera come servizio indipendente insieme all'applicazione. Questa scelta dell'architettura influisce su fattori quali il flusso di lavoro di sviluppo e la complessità operativa.

Aspetto Microsoft.Identity.Web (In-Process) Microsoft Entra SDK per AgentID (fuori dal processo)
Limite del processo Condivide lo stesso processo, memoria e ciclo di vita dell'applicazione, abilitando le chiamate ai metodi diretti e la configurazione condivisa Mantiene l'isolamento completo, comunicando solo tramite le API HTTP e gestendo le proprie risorse in modo indipendente
Accoppiamento del linguaggio Associa strettamente la strategia di autenticazione a .NET, richiedendo esperienza C# e runtime .NET ovunque sia necessaria l'autenticazione Separa l'autenticazione dallo stack di tecnologie dell'applicazione, esponendo un'interfaccia HTTP indipendente dal linguaggio che funziona altrettanto bene con Python, Node.js, Go o qualsiasi linguaggio che supporta HTTP
Modello di distribuzione Distribuisce come pacchetti NuGet incorporati nel file binario dell'applicazione, creando un'unità di distribuzione monolitica Distribuisce come immagine del contenitore separata, abilitando il controllo delle versioni, il ridimensionamento e gli aggiornamenti della logica di autenticazione senza influire sul codice dell'applicazione

Microsoft.Identity.Web (In-Process)

Questo frammento di codice mostra come Microsoft.Identity.Web si integra direttamente in un'applicazione 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);
    }
}

Microsoft Entra SDK per AgentID (fuori dal processo)

Questo frammento di codice illustra come chiamare Microsoft Entra SDK per AgentID da un'applicazione Node.js tramite HTTP. La chiamata all'endpoint dell'SDK /DownstreamApi gestisce l'acquisizione di token e le chiamate API downstream, incluso il passaggio del token in ingresso per i flussi OBO nell'intestazione Authorization :

// 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);
}

Confronto tra funzionalità

Caratteristica / Funzionalità Microsoft.Identity.Web Microsoft Entra SDK per AgentID
Supporto per la lingua Solo C# / .NET Qualsiasi linguaggio (HTTP)
Deployment Libreria in corso Contenitore separato
Acquisizione di token ✅ MSAL.NET diretta ✅ Tramite l'API HTTP
Memorizzazione nella cache dei token ✅ In-memory, ✅ distribuita ✅ In-memory, ❌ distribuito
Flusso OBO ✅ Supporto nativo ✅ Tramite endpoint HTTP
Credenziali Client ✅ Supporto nativo ✅ Tramite endpoint HTTP
Identità gestita ✅ Supporto diretto ✅ Supporto diretto
Identità agente ✅ Tramite estensioni ✅ Parametri di query
Convalida dei token ✅ Middleware ✅ /Punto finale di convalida
Downstream API ✅ IDownstreamApi ✅ /DownstreamApi endpoint
Microsoft Graph ✅ Integrazione di Graph SDK ⚠️ Tramite DownstreamApi
Prestazioni ⚡ In elaborazione (il più veloce) 🔄 Overhead di HTTP
Configuration appsettings.json e codice appsettings.json e Variabili di ambiente
Debug ✅ Debug del .NET standard ⚠️ Debug dei contenitori
Ricaricamento rapido ✅ Ricaricamento rapido di .NET ❌ Riavvio del contenitore
Aggiornamenti dei pacchetti 📦 Pacchetti NuGet 🐳 Immagini del contenitore
Licenza MIT MIT

Quando usare ogni approccio

La scelta tra Microsoft.Identity.Web e Microsoft Entra SDK per AgentID dipende dai requisiti, dall'architettura e dalla strategia di distribuzione dell'applicazione. A seconda delle esigenze, un approccio può essere più adatto rispetto all'altro e le linee guida seguenti possono aiutare a prendere una decisione informata.

Scenario Microsoft.Identity.Web (In-Process) Microsoft Entra SDK per AgentID (fuori dal processo)
Stack di applicazioni Applicazioni .NET esclusivamente
• API Web di base ASP.NET
• app Web principali ASP.NET
• Servizi di lavoro .NET
• Applicazioni Blazor
• App demone
Microservizi multilingua
• Node.js, Python, Go, servizi Java
• Architetture poliglotte
servizi non .NET
• Integrazione dei sistemi legacy
Requisiti di prestazioni Le prestazioni sono fondamentali
• Scenari con velocità effettiva elevata
• Operazioni sensibili alla latenza
• Ogni millisecondo conta
Può tollerare il sovraccarico HTTP
• Circa 1-5 ms di latenza aggiuntiva accettabile
• Velocità effettiva non limitata dall'autenticazione
Esigenze di integrazione Integrazione approfondita richiesta
• Configurazione MSAL.NET personalizzata
• Accesso diretto alle funzionalità MSAL
• Strategie avanzate della cache dei token
Integrazione standardizzata
• API HTTP sufficiente
• Modelli di autenticazione coerenti tra i servizi
Esperienza di sviluppo Sviluppo rapido
• Creazione rapida di prototipi
• Ricaricamento rapido per lo sviluppo
• Debug .NET standard
Sviluppo basato su contenitori
• Riavvio del contenitore per le modifiche
• È necessario eseguire il debug dei contenitori
Team & Architecture Stack a linguaggio singolo
• Competenze del team in C#/.NET
• Nessun requisito multilingue
Diversità tecnologica
• Combinazione di framework e linguaggi
• Struttura del team poliglotta
Modello di distribuzione Distribuzioni monolitiche
• Distribuzione di un'applicazione singola
• Modelli di hosting tradizionali
Distribuzioni in contenitori
• Ambienti Kubernetes
• Configurazioni di Docker Compose
• Architetture di service mesh
Operations Aggiornamenti dell'autenticazione accoppiata
• Le modifiche all'autenticazione richiedono la ricompilazione dell'app
• Ciclo di vita condiviso con l'applicazione
Vantaggi operativi
• Scalabilità indipendente della logica di autenticazione
• Separare gli aggiornamenti dell'autenticazione dal codice dell'app
• Monitoraggio centralizzato dell'autenticazione

Linee guida per la migrazione

Migrazione da Microsoft.Identity.Web a Microsoft Entra SDK per AgentID

In alcuni scenari può essere necessario eseguire la migrazione di un'applicazione .NET esistente usando Microsoft.Identity.Web per sfruttare Microsoft Entra SDK per AgentID per l'autenticazione. I motivi della migrazione possono includere l'adozione di un'architettura multi-linguaggio, la standardizzazione dell'autenticazione tra servizi o il passaggio a un modello di distribuzione in contenitori.

Prima di eseguire questa operazione, è necessaria un'attenta pianificazione. Questa sezione fornisce un percorso di migrazione di alto livello con esempi di codice che consentono di eseguire la transizione dell'applicazione.

Attenzione

Microsoft non consiglia di passare da Microsoft.Identity.Web a Microsoft Entra SDK per AgentID, ma se si sceglie di farlo, di seguito sono riportate dimostrazioni di concetti simili in altri linguaggi e framework.

Passaggio 1: Distribuire il contenitore SDK

Prima di tutto, è necessario aggiungere il contenitore 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"

Passaggio 2: Eseguire la migrazione della configurazione

Successivamente, sarà necessario trasferire la configurazione da appsettings.json a variabili di ambiente:

Before (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"
    }
  }
}

Dopo (Kubernetes ConfigMap/Variabili di ambiente)

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"

Passaggio 3: Aggiornare il codice dell'applicazione

Individua tutte le istanze delle chiamate in-process a Microsoft.Identity.Web e sostituiscile con chiamate HTTP agli endpoint dell'SDK di Microsoft Entra per AgentID.

Before (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);
    }
}

Dopo (qualsiasi linguaggio con client HTTP):

Nel frammento di codice seguente è possibile visualizzare le chiamate a Microsoft Entra SDK per AgentID usando l'endpoint /DownstreamApi per ottenere i dati utente. Gli esempi sono disponibili in C# e 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

La stessa logica può essere implementata in TypeScript come segue:

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;
}

Passaggio 4: Rimuovere le dipendenze Microsoft.Identity.Web

Dopo aver completato i passaggi precedenti, è possibile riordinare l'applicazione rimuovendo i pacchetti NuGet usati da Microsoft.Identity.Web dal progetto:

<!-- Remove these from .csproj -->
<PackageReference Include="Microsoft.Identity.Web" Version="..." />
<PackageReference Include="Microsoft.Identity.Web.MicrosoftGraph" Version="..." />
<PackageReference Include="Microsoft.Identity.Web.DownstreamApi" Version="..." />

Se vuoi ancora convalidare i token nell'app, non devi rimuovere completamente la configurazione di autenticazione originale, anche se puoi delegare completamente la convalida a Microsoft Entra SDK per AgentID.

// Remove from Program.cs or Startup.cs
services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("Graph", Configuration.GetSection("DownstreamApis:Graph"))
    .AddInMemoryTokenCaches();

Passaggio 5: Testare e convalidare

  1. Unit test: aggiornare i test per simulare le chiamate HTTP all'SDK
  2. Test di integrazione: Testare la comunicazione SDK nell'ambiente di staging
  3. Test delle prestazioni: misurare l'impatto dell'overhead HTTP
  4. Test di sicurezza: convalidare la gestione dei token e i criteri di rete

Considerazioni sulle prestazioni

Overhead dell'SDK

Microsoft Entra SDK per AgentID introduce un sovraccarico di comunicazione HTTP:

Fattore di prestazioni Impatto Strategia di mitigazione
Latency ~1-5 ms per richiesta di comunicazione localhost Usare HTTP/2 per ridurre il sovraccarico di connessione
Throughput Limitato dal pool di connessioni HTTP Implementare il pool di connessioni per riutilizzare le connessioni HTTP
Memoria Sovraccarico aggiuntivo della memoria del contenitore Garantire un'allocazione adeguata delle risorse SDK
Efficienza delle richieste Trasferimenti multipli per operazioni complesse Richieste in batch per combinare più operazioni quando possibile
Prestazioni dei token Sovraccarico di acquisizione di token ripetuto Sfruttare la cache dei token dell'SDK per ottenere prestazioni ottimali

prestazioni durante il processo

L'uso di Microsoft.Identity.Web ha un sovraccarico minimo perché viene eseguito nello stesso processo dell'applicazione, fornendo chiamate di metodi nativi con latenza microseconda e memoria del processo condiviso senza limitazioni HTTP. Quando le prestazioni sono critiche, l'integrazione in-process è la scelta ottimale, ma la flessibilità e la progettazione indipendente dal linguaggio di Microsoft Entra SDK per AgentID possono superare i compromessi delle prestazioni in molti scenari.

Di seguito sono riportati alcuni confronti tra prestazioni e costi per l'utilizzo in-process e l'utilizzo di Microsoft Entra SDK per AgentID (Out-of-Process):

Considerazioni sul costo

Fattore di costo Microsoft.Identity.Web (In-Process) Microsoft Entra SDK per AgentID (fuori dal processo)
Calcolo Cpu/memoria aggiuntiva minima nel processo dell'applicazione Risorse aggiuntive del contenitore per ogni pod
Network Nessun sovraccarico aggiuntivo Minimo (comunicazione localhost)
Spazio di archiviazione Dimensioni del pacchetto NuGet (~10MB) Archiviazione di immagini del contenitore
Gestione Nessun sovraccarico aggiuntivo Overhead dell'orchestrazione dei contenitori

Esempio di costo

Per 10 repliche con configurazione 128Mi/100m SDK:

Conto risorse In lavorazione Microsoft Entra SDK per AgentID
Memoria ~0 MB aggiuntivi 10 × 128Mi = 1,28 GB
CPU ~0% aggiuntivo 10 × 100m = 1 core
Spazio di archiviazione ~10 MB per distribuzione Dimensioni dell'immagine del contenitore per nodo

Supporto e manutenzione

Aspetto Microsoft.Identity.Web Microsoft Entra SDK per AgentID
Updates Aggiornamenti dei pacchetti NuGet Aggiornamenti delle immagini del contenitore
Modifiche di rilievo Tramite il controllo delle versioni dei pacchetti Tramite tag contenitore
Correzioni di bug Integrazione in fase di compilazione Aggiornamenti dei contenitori di runtime
Patch di sicurezza Ricompilare l'applicazione Ridistribuire il contenitore
Documentazione Documentazione completa di .NET Questa documentazione
Community Community .NET di grandi dimensioni Community in crescita

Approccio ibrido

È possibile combinare entrambi gli approcci all'interno della stessa architettura: usare Microsoft.Identity.Web per i servizi .NET che richiedono prestazioni massime, sfruttando microsoft Entra SDK per AgentID per i servizi non-.NET o quando sono necessari modelli di autenticazione indipendenti dal linguaggio. Questa strategia ibrida consente di ottimizzare le prestazioni in cui è fondamentale mantenendo la coerenza e la flessibilità nell'intero ecosistema di servizi.

Un'architettura di esempio è la seguente:

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

Passaggi successivi