Porównanie: zestaw SDK do uwierzytelniania Microsoft Entra ID (sidecar) w porównaniu z wewnątrzprocesowym Microsoft.Identity.Web

Ten przewodnik pomaga zrozumieć różnice między pakietem Microsoft Entra ID Auth SDK (sidecar) a biblioteką Microsoft.Identity.Web działającą w procesie, służącymi do obsługi uwierzytelniania w aplikacjach. Microsoft. Biblioteka Identity.Web integruje się bezpośrednio z aplikacjami .NET w celu uzyskania maksymalnej wydajności. Zestaw SDK uwierzytelniania Microsoft Entra ID (sidecar) działa jako oddzielny kontener i obsługuje każdy język programowania za pośrednictwem interfejsów API HTTP. Wybór prawidłowego 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 procesie aplikacji. Zestaw SDK uwierzytelniania Microsoft Entra ID (sidecar) działa jako niezależna usługa obok Twojej 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) pakiet SDK uwierzytelniania Microsoft Entra ID (sidecar) (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 wiąże strategię uwierzytelniania z platformą .NET, wymagając doświadczenia w języku C# i środowiska uruchomieniowego .NET w każdym miejscu, gdzie jest potrzebne uwierzytelnianie. Rozdziela uwierzytelnianie ze stosu technologii aplikacji, uwidaczniając niezależny od języka interfejs HTTP, który działa równie dobrze z Python, Node.js, Go lub dowolnym językiem 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 (proces)

Ten fragment kodu pokazuje, jak Microsoft.Identity.Web integruje się bezpośrednio z aplikacją 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 SDK do uwierzytelniania Microsoft Entra ID (sidecar) (poza procesem)

Ten fragment kodu pokazuje, jak wywołać SDK uwierzytelniania Microsoft Entra ID (sidecar) z aplikacji Node.js za pomocą 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 zestaw SDK uwierzytelniania Microsoft Entra ID (sidecar)
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średni MSAL.NET Za pośrednictwem interfejsu API HTTP
Buforowanie tokenów Rozproszone, działające w pamięci Rozproszone, działające w pamięci
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 Weryfikowanie punktu końcowego
Kolejny interfejs API IDownstreamApi punkt końcowy /DownstreamApi
Microsoft Graph Integracja z zestawem Graph SDK Za pośrednictwem narzędzia DownstreamApi
Wydajność W toku (najszybszy) Obciążenie HTTP
Configuration appsettings.json i kod appsettings.json i zmienne środowiskowe
Debugowanie Standardowe debugowanie .NET Debugowanie kontenera
Przeładowywanie na gorąco .NET Przeładowywanie na gorąco - Ponowne ładowanie na gorąco Ponowne uruchamianie kontenera
Aktualizacje pakietów Pakiety NuGet Obrazy kontenerów
Licencja MIT MIT

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

To, czy wybrać Microsoft.Identity.Web, czy Microsoft Entra ID Auth SDK (sidecar), zależy od wymagań aplikacji, jej architektury i strategii wdrażania. W zależności od potrzeb jedno podejście może być bardziej odpowiednie niż inne. Poniższe wskazówki mogą pomóc w podjęciu świadomej decyzji.

Scenario Microsoft.Identity.Web (In-Process) zestaw SDK uwierzytelniania Microsoft Entra ID (przyczepka) (poza procesem)
Stack technologiczny aplikacje .NET wyłącznie
• ASP.NET Core API Webowych
• ASP.NET Core Web Apps
• Usługi .NET Worker Services
• Aplikacje Blazor
• Aplikacje demona
Mikrousługi wielojęzyczne
• usługi Node.js, Python, Go, Java
• Architektury wielo-językowe
• Usługi inne niż .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 ID Auth SDK (sidecar)

W niektórych scenariuszach możesz chcieć zmigrować istniejącą aplikację platformy .NET, która korzysta z Microsoft.Identity.Web, tak aby używała pakietu Microsoft Entra ID Auth SDK (sidecar) 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 wprowadzeniem tej zmiany 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

Microsoft nie zaleca migrowania z Microsoft.Identity.Web do zestawu SDK uwierzytelniania Microsoft Entra ID (sidecar). Jeśli zdecydujesz się wprowadzić tę zmianę, w poniższych przykładach przedstawiono podobne pojęcia w innych językach i strukturach.

Krok 1. Wdrażanie kontenera zestawu SDK

Najpierw dodaj kontener SDK do zasobnika:

# Before: Single ASP.NET Core container
containers:
- name: app
  image: myregistry/myapp:latest

# After: App + Microsoft Entra ID Auth SDK (sidecar)
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 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 biblioteki Microsoft.Identity.Web i zastąp je wywołaniami HTTP do punktów końcowych zestawu SDK uwierzytelniania Microsoft Entra ID (sidecar):

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 widać wywołania zestawu SDK uwierzytelniania Microsoft Entra ID (sidecar) z użyciem punktu końcowego /DownstreamApi w celu pobrania danych 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: Usuń zależności Microsoft.Identity.Web

Po wykonaniu poprzednich kroków należy uporządkować aplikację, usuwając pakiety NuGet dla 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 usuwać oryginalnej konfiguracji uwierzytelniania. Zamiast tego można delegować walidację całkowicie do zestawu SDK uwierzytelniania Microsoft Entra ID (przyczepki).

// 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 przejściowym.
  3. Testy wydajnościowe: Mierzenie wpływu na obciążenie HTTP.
  4. Testy zabezpieczeń: Weryfikowanie obsługi tokenów i zasad sieciowych.

Zagadnienia dotyczące wydajności

Obciążenie związane z zestawem SDK

Zestaw MICROSOFT ENTRA ID Auth SDK (sidecar) wprowadza obciążenie komunikacji HTTP:

Współczynnik wydajności Wpływ Strategia ograniczania ryzyka
Latency Około 1–5 ms na każdą żądanie komunikacji przez localhost Użyj protokołu HTTP/2, aby zmniejszyć obciążenie połączenia.
Throughput Ograniczone przez buforowanie połączeń HTTP Zaimplementuj buforowanie połączeń w celu ponownego użycia połączeń HTTP.
Pamięć Dodatkowe obciążenie pamięci kontenera Upewnij się, że zasoby zestawu SDK są odpowiednio alokowane.
Wydajność żądań Wiele rund dla złożonych operacji Żądania wsadowe do łączenia wielu operacji, jeśli to możliwe.
Wydajność tokenu Powtarzający się narzut związany z pozyskiwaniem tokenów Korzystaj z pamięci podręcznej tokenów zestawu SDK w celu uzyskania optymalnej wydajności.

wydajność In-Process

Korzystanie z Microsoft.Identity.Web ma minimalne zużycie zasobów, ponieważ działa w ramach tego samego procesu co aplikacja. Zapewnia ona natywne wywołania metod z opóźnieniem rzędu mikrosekund i współdzieloną pamięcią procesu bez ograniczeń protokołu HTTP. Gdy wydajność jest krytyczna, integracja procesów jest optymalnym wyborem. Jednak elastyczność pakietu Microsoft Entra ID Auth SDK (sidecar) oraz jego konstrukcja niezależna od języka mogą w wielu scenariuszach przeważać nad kompromisami dotyczącymi wydajności.

W poniższej tabeli przedstawiono porównania wydajności i kosztów dla użycia w ramach procesu oraz korzystania z zestawu SDK uwierzytelniania Microsoft Entra ID (sidecar) poza procesem:

Zagadnienia dotyczące kosztów

Współczynnik kosztów Microsoft.Identity.Web (In-Process) zestaw SDK do uwierzytelniania Microsoft Entra ID (sidecar) (poza procesem)
Środowisko obliczeniowe Minimalne dodatkowe zużycie procesora i pamięci w procesie aplikacji Dodatkowe zasoby kontenera na każdy pod.
Network Brak dodatkowych obciążeń Minimalna komunikacja w 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 o pojemności 128 miB/100 m:

Resource W toku zestaw SDK uwierzytelniania Microsoft Entra ID (sidecar)
Pamięć Dodatkowe ok. 0 MB 10 × 128 MiB = 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 zestaw SDK uwierzytelniania Microsoft Entra ID (sidecar)
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 .NET Ta dokumentacja
Community Duża społeczność .NET Rosnąca społeczność

Podejście hybrydowe

Oba podejścia można połączyć w ramach tej samej architektury. Użyj Microsoft.Identity.Web dla usług .NET, które wymagają maksymalnej wydajności, i użyj zestawu Microsoft Entra ID Auth SDK (w modelu sidecar) dla usług innych niż .NET lub wtedy, gdy potrzebujesz wzorców uwierzytelniania niezależnych od języka. Ta strategia hybrydowa pomaga zoptymalizować wydajność, w której ma kluczowe znaczenie, zachowując spójność i elastyczność w całym ekosystemie usług.

Przykładowa architektura jest następująca:

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 ID Auth SDK (sidecar)</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