Udostępnij przez


Porównanie: Microsoft Entra SDK for AgentID a In-Process Microsoft.Identity.Web

Ten przewodnik pomaga zidentyfikować różnice między zestawem Microsoft Entra SDK for AgentID i biblioteką Microsoft.Identity.Web do obsługi uwierzytelniania w aplikacjach. Biblioteka Microsoft.Identity.Web integruje się bezpośrednio z aplikacjami .NET w celu uzyskania maksymalnej wydajności, podczas gdy zestaw Microsoft Entra SDK for AgentID działa jako oddzielny kontener i obsługuje dowolny język programowania za pośrednictwem interfejsów API HTTP, a wybór poprawnego podejścia zależy od architektury, języka i środowiska wdrażania aplikacji.

Różnice architektury

Podstawowa różnica polega na miejscu wykonywania logiki uwierzytelniania. Microsoft.Identity.Web działa w ramach procesu aplikacji, a zestaw Microsoft Entra SDK for AgentID działa jako niezależna usługa obok aplikacji. Ten wybór architektury ma wpływ na czynniki, takie jak przepływ pracy programowania i złożoność operacyjna.

Aspekt Microsoft.Identity.Web (In-Process) Zestaw Microsoft Entra SDK dla identyfikatora agenta (poza procesem)
Granica procesu Udostępnia wspólny proces, pamięć i cykl życia z aplikacją, umożliwiając bezpośrednie wywoływanie metod i współdzielenie konfiguracji Utrzymuje pełną izolację, komunikując się tylko za pośrednictwem interfejsów API HTTP i zarządzając własnymi zasobami niezależnie
Sprzęganie języka Ściśle łączy strategię uwierzytelniania z platformą .NET, wymagając środowiska języka C# i środowiska uruchomieniowego platformy .NET wszędzie, gdzie potrzebujesz uwierzytelniania Rozdziela uwierzytelnianie ze stosu technologii aplikacji, uwidaczniając niezależny od języka interfejs HTTP, który działa równie dobrze w języku Python, Node.js, Go lub dowolnym języku obsługującym protokół HTTP
Model wdrażania Wdraża jako pakiety NuGet osadzone w pliku binarnym aplikacji, tworząc monolityczną jednostkę wdrażania Wdraża jako oddzielny obraz kontenera, umożliwiając niezależne przechowywanie wersji, skalowanie i aktualizacje logiki uwierzytelniania bez wpływu na kod aplikacji

Microsoft.Identity.Web (In-Process)

Ten fragment kodu pokazuje, jak platforma Microsoft.Identity.Web integruje się bezpośrednio z aplikacją platformy 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);
    }
}

Zestaw Microsoft Entra SDK dla identyfikatora agenta (poza procesem)

Ten fragment kodu pokazuje, jak wywołać zestaw Microsoft Entra SDK for AgentID z aplikacji Node.js przy użyciu protokołu HTTP. Wywołanie punktu końcowego /DownstreamApi zestawu SDK obsługuje pozyskiwanie tokenów i wywołania interfejsów API podrzędnych, w tym przekazywanie przychodzącego tokenu dla przepływów OBO w nagłówku 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);
}

Porównanie funkcji

Funkcja Microsoft.Identity.Web Microsoft Entra SDK dla AgentID
Obsługa języków Tylko język C# /.NET Dowolny język (HTTP)
Wdrożenie Biblioteka w trakcie procesu Oddzielny kontener
Pozyskiwanie tokenów ✅ Bezpośrednie MSAL.NET ✅ Za pośrednictwem interfejsu API HTTP
Buforowanie tokenów ✅W pamięci, ✅ rozproszona ✅Rozproszona pamięć ❌
Przepływ OBO ✅ Natywna obsługa ✅ Za pośrednictwem punktu końcowego HTTP
Poświadczenia klienta ✅ Natywna obsługa ✅ Za pośrednictwem punktu końcowego HTTP
Tożsamość zarządzana ✅ Bezpośrednia obsługa ✅ Bezpośrednia obsługa
Tożsamości agenta ✅ Za pośrednictwem rozszerzeń ✅ Parametry zapytania
Walidacja tokenu ✅ Oprogramowanie pośredniczące ✅ /Validate endpoint (Weryfikowanie punktu końcowego)
Kolejny interfejs API ✅ IDownstreamApi ✅ /DownstreamApi punkt końcowy
Microsoft Graph ✅ Integracja z zestawem Graph SDK ⚠️ Za pośrednictwem DownstreamApi
Wydajność ⚡ W trakcie realizacji (najszybszy) 🔄 Obciążenie http
Configuration appsettings.json i kod appsettings.json i zmienne środowiskowe
Debugowanie ✅ Standardowe debugowanie platformy .NET ⚠✔ Debugowanie kontenera
Przeładowywanie na gorąco ✅ Automatyczne ładowanie .NET ❌ Ponowne uruchamianie kontenera
Aktualizacje pakietów 📦 Pakiety NuGet 🐳 Obrazy kontenerów
Licencja MIT MIT

Kiedy należy używać każdego podejścia

Wybór między microsoft.Identity.Web a zestawem Microsoft Entra SDK for AgentID zależy od wymagań, architektury i strategii wdrażania aplikacji. W zależności od potrzeb jedno podejście może być bardziej odpowiednie niż inne, a poniższe wskazówki mogą pomóc w podjęciu świadomej decyzji.

Scenario Microsoft.Identity.Web (In-Process) Zestaw Microsoft Entra SDK dla identyfikatora agenta (poza procesem)
Stack technologiczny Aplikacje platformy .NET wyłącznie
• podstawowe interfejsy API sieci Web ASP.NET
• ASP.NET Core Web Apps
• Usługi robocze platformy .NET
• Aplikacje Blazor
• Aplikacje demona
Mikrousługi wielojęzyczne
• Node.js, Python, Go, Usługi Java
• Architektury wielo-językowe
• usługi spoza .NET
• Integracja starszych systemów
Wymagania dotyczące wydajności Wydajność jest krytyczna
• Scenariusze o wysokiej przepływności
• Operacje wrażliwe na opóźnienia
Każda milisekunda się liczy
Może tolerować obciążenie http
• ~1–5 ms dodatkowe opóźnienie dopuszczalne
• Przepustowość nie jest ograniczana przez uwierzytelnianie
Potrzeby integracji Wymagana jest głęboka integracja
• Niestandardowa konfiguracja MSAL.NET
• Bezpośredni dostęp do funkcji biblioteki MSAL
• Zaawansowane strategie pamięci podręcznej tokenów
Standaryzacja integracji
• Wystarczająca ilość interfejsu API HTTP
• Spójne wzorce uwierzytelniania między usługami
Doświadczenie w programowaniu Szybki rozwój
• Szybkie tworzenie prototypów
• Przeładowywanie na gorąco na potrzeby programowania
• Standardowe debugowanie .NET
Programowanie oparte na kontenerach
• Ponowne uruchamianie kontenera w przypadku zmian
• Wymagane debugowanie kontenera
Zespół i architektura Stos jednojęzyczny
• Wiedza zespołowa w języku C#/.NET
• Brak wymagań dotyczących wielu języków
Różnorodność technologii
• Mieszanka struktur i języków
• Struktura zespołu polyglot
Model wdrażania Wdrożenia monolityczne
• Wdrażanie pojedynczej aplikacji
• Tradycyjne modele hostingu
Wdrożenia konteneryzowane
• Środowiska Kubernetes
• Konfiguracje narzędzia Docker Compose
• Architektury siatki usług
Operations Zintegrowane aktualizacje uwierzytelniania
• Zmiany uwierzytelniania wymagają ponownego kompilowanie aplikacji
• Wspólny cykl życia z aplikacją
Korzyści operacyjne
• Niezależne skalowanie logiki uwierzytelniania
• Oddzielanie aktualizacji uwierzytelniania od kodu aplikacji
• Scentralizowane monitorowanie uwierzytelniania

Wskazówki dotyczące migracji

Migracja z Microsoft.Identity.Web do Microsoft Entra SDK dla identyfikatora AgentID

W niektórych scenariuszach możesz chcieć zmigrować istniejącą aplikację .NET przy użyciu Microsoft.Identity.Web, aby skorzystać z zestawu SDK Microsoft Entra dla AgentID do uwierzytelniania. Przyczyny migracji mogą obejmować wdrożenie architektury wielojęzycznej, standaryzację uwierzytelniania między usługami lub przejście do konteneryzowanego modelu wdrażania.

Przed wykonaniem tej czynności należy dokładnie rozważyć i zaplanować. Ta część zawiera ogólną ścieżkę migracji z przykładami kodu, które ułatwiają migrację aplikacji.

Ostrzeżenie

Firma Microsoft nie zaleca przejścia z witryny Microsoft.Identity.Web do zestawu Microsoft Entra SDK for AgentID, ale jeśli zdecydujesz się to zrobić, poniżej przedstawiono pokazy podobnych pojęć w innych językach i strukturach.

Krok 1. Wdrażanie kontenera zestawu SDK

Najpierw musisz dodać kontener SDK do zasobnika.

# 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"

Krok 2. Migrowanie konfiguracji

Następnie należy przenieść konfigurację z appsettings.json do zmiennych środowiskowych:

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

Po (Kubernetes ConfigMap / Zmienne środowiskowe)

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"

Krok 3. Aktualizowanie kodu aplikacji

Znajdź wszystkie wystąpienia wywołań w procesie do microsoft.Identity.Web i zastąp je wywołaniami HTTP do zestawu Microsoft Entra SDK dla punktów końcowych AgentID:

Przed (C# z 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);
    }
}

Po (dowolny język z klientem HTTP):

W poniższym fragmencie kodu można zobaczyć wywołania Microsoft Entra SDK dla AgentID przy użyciu punktu końcowego /DownstreamApi, aby pobrać dane użytkownika. Przykłady są dostępne w językach C# i 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

Tę samą logikę można zaimplementować w języku TypeScript w następujący sposób:

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

Krok 4. Usuwanie zależności Microsoft.Identity.Web

Po zakończeniu poprzednich kroków możesz uporządkować aplikację, usuwając pakiety NuGet używane przez microsoft.Identity.Web z projektu:

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

Jeśli nadal chcesz zweryfikować tokeny w aplikacji, nie musisz w pełni usuwać oryginalnej konfiguracji uwierzytelniania, chociaż można delegować walidację całkowicie do zestawu Microsoft Entra SDK for AgentID.

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

Krok 5. Testowanie i weryfikowanie

  1. Testy jednostkowe: aktualizowanie testów w celu pozorowania wywołań HTTP do zestawu SDK
  2. Testy integracyjne: testowanie komunikacji SDK w środowisku staging
  3. Testy wydajnościowe: mierzenie wpływu na obciążenie HTTP
  4. Testy zabezpieczeń: weryfikowanie obsługi tokenów i zasad sieci

Zagadnienia dotyczące wydajności

Obciążenie zestawu SDK

Zestaw Microsoft Entra SDK for AgentID wprowadza obciążenie komunikacji HTTP:

Współczynnik wydajności Wpływ Strategia ograniczania ryzyka
Latency ~1–5 ms na każde żądanie komunikacji localhost Użyj protokołu HTTP/2, aby zmniejszyć obciążenie połączenia
Throughput Ograniczone przez buforowanie połączeń HTTP Zastosuj buforowanie połączeń, aby ponownie używać połączeń HTTP
Pamięć Dodatkowe obciążenie pamięci kontenera Zapewnianie odpowiedniej alokacji zasobów zestawu SDK
Wydajność żądań Wiele rund dla złożonych operacji Żądania wsadowe w celu łączenia wielu operacji, jeśli to możliwe
Wydajność tokenu Powtarzający się narzut związany z pozyskiwaniem tokenów Wykorzystanie pamięci podręcznej tokenów zestawu SDK w celu uzyskania optymalnej wydajności

wydajność In-Process

Użycie biblioteki Microsoft.Identity.Web ma minimalne obciążenie, ponieważ działa w ramach tego samego procesu co aplikacja, zapewniając natywne wywołania metod z mikrosekundowymi opóźnieniami i pamięcią współużytkowanego procesu bez ograniczeń protokołu HTTP. Gdy wydajność jest krytyczna, integracja w procesie jest optymalnym wyborem, ale elastyczność i niezależność od języka projektu zestawu Microsoft Entra SDK dla AgentID może przewyższać kompromisy wydajności w wielu scenariuszach.

Poniżej przedstawiono porównania wydajności i kosztów użycia metodą in-process oraz Microsoft Entra SDK dla AgentID w trybie Out-of-Process.

Zagadnienia dotyczące kosztów

Współczynnik kosztów Microsoft.Identity.Web (In-Process) Zestaw Microsoft Entra SDK dla identyfikatora agenta (poza procesem)
Środowisko obliczeniowe Minimalne dodatkowe wykorzystanie CPU/pamięci w procesie aplikacji Dodatkowe zasoby kontenera na pod
Network Brak dodatkowych obciążeń Minimalna (komunikacja localhost)
Przechowywanie Rozmiar pakietu NuGet (~10 MB) Przechowywanie obrazów kontenerów
Zarządzanie Brak dodatkowych obciążeń Obciążenie związane z orkiestracją kontenerów

Przykład kosztów

W przypadku 10 replik z konfiguracją zestawu SDK 128Mi/100m:

Resource W toku Microsoft Entra SDK dla AgentID
Pamięć Ok. 0 MB dodatkowe 10 × 128Mi = 1,28 GB
CPU ~0% dodatkowe 10 × 100 m = 1 rdzeń
Przechowywanie ~10 MB na wdrożenie Rozmiar obrazu kontenera na węzeł

Pomoc techniczna i konserwacja

Aspekt Microsoft.Identity.Web Microsoft Entra SDK dla AgentID
Updates Aktualizacje pakietów NuGet Aktualizacje obrazu kontenera
Niezgodne zmiany Poprzez wersjonowanie pakietów Za pomocą tagów kontenera
Poprawki błędów Integracja czasu kompilacji Aktualizacje kontenera środowiska uruchomieniowego
Poprawki zabezpieczeń Ponowne kompilowanie aplikacji Ponowne wdrażanie kontenera
dokumentacja Obszerne dokumenty platformy .NET Ta dokumentacja
Community Duża społeczność platformy .NET Rosnąca społeczność

Podejście hybrydowe

Oba podejścia można połączyć w ramach tej samej architektury: użyj biblioteki Microsoft.Identity.Web dla usług .NET, które wymagają maksymalnej wydajności, a jednocześnie korzystając z zestawu Microsoft Entra SDK dla identyfikatora AgentID dla usług non-.NET lub gdy potrzebujesz wzorców uwierzytelniania niezależnego od języka. Ta strategia hybrydowa umożliwia optymalizowanie wydajności, gdy krytyczne jest zachowanie spójności i elastyczności w całym ekosystemie usług.

Przykładowa architektura wygląda następująco:

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

Dalsze kroki