次の方法で共有


比較: Microsoft Entra SDK for AgentID と In-Process Microsoft.Identity.Web

このガイドでは、Microsoft Entra SDK for AgentID と、アプリケーションで認証を処理するためのインプロセス Microsoft.Identity.Web ライブラリの違いを特定するのに役立ちます。 Microsoft.Identity.Web ライブラリはパフォーマンスを最大化するために .NET アプリケーションに直接統合されますが、Microsoft Entra SDK for AgentID は個別のコンテナーとして実行され、HTTP API を介して任意のプログラミング言語をサポートします。適切なアプローチの選択は、アプリケーションのアーキテクチャ、言語、およびデプロイ環境によって異なります。

アーキテクチャの違い

基本的な違いは、 認証ロジックが実行される場所にあります。 Microsoft.Identity.Web はアプリケーション プロセス内で実行されますが、Microsoft Entra SDK for AgentID はアプリケーションと共に独立したサービスとして動作します。 このアーキテクチャの選択は、開発ワークフローや運用の複雑さなどの要因に影響します。

特徴 Microsoft.Identity.Web (In-Process) Microsoft Entra SDK for AgentID (Out-of-Process)
プロセス境界 アプリケーションと同じプロセス、メモリ、ライフサイクルを共有し、ダイレクト メソッド呼び出しと共有構成を有効にします 完全な分離を維持し、HTTP API 経由でのみ通信し、独自のリソースを個別に管理します
言語結合 認証戦略を .NET と密接に結び付け、認証が必要な場所で C# エクスペリエンスと .NET ランタイムを必要とします アプリケーションのテクノロジ スタックから認証を分離し、Python、Node.js、Go、または任意の HTTP 対応言語と同等に機能する言語に依存しない HTTP インターフェイスを公開します
デプロイメント モデル アプリケーション バイナリに埋め込まれた NuGet パッケージとしてデプロイし、モノリシック デプロイ ユニットを作成する 個別のコンテナー イメージとしてデプロイし、アプリケーション コードに影響を与えることなく、認証ロジックの独立したバージョン管理、スケーリング、および更新を有効にします。

Microsoft.Identity.Web (In-Process)

このコード スニペットは、Microsoft.Identity.Web が 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 for AgentID (Out-of-Process)

このコード スニペットは、HTTP を使用して、Node.js アプリケーションから Microsoft Entra SDK for AgentID を呼び出す方法を示しています。 SDK の /DownstreamApi エンドポイントへの呼び出しは、 Authorization ヘッダーで OBO フローの受信トークンを渡すなど、トークンの取得とダウンストリーム API 呼び出しを処理します。

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

機能の比較

特徴 Microsoft.Identity.Web Microsoft Entra SDK for AgentID
言語サポート C# / .NET のみ 任意の言語 (HTTP)
Deployment プロセス内ライブラリ 個別のコンテナー
トークンの取得 ✅ ダイレクト MSAL.NET ✅ HTTP API 経由
トークン キャッシュ ✅ インメモリ、✅ 分散型 ✅ メモリ内、 ❌分散
OBO フロー ✅ ネイティブ サポート ✅ HTTP エンドポイント経由
クライアント資格情報 ✅ ネイティブ サポート ✅ HTTP エンドポイント経由
マネージド ID ✅ 直接サポート ✅ 直接サポート
エージェント ID ✅ 拡張機能を通して ✅ クエリ パラメーター
トークンの検証 ✅ ミドルウェア ✅ /エンドポイントを検証する
ダウンストリーム API ✅ IDownstreamApi ✅ /DownstreamApi エンドポイント
Microsoft Graph ✅ Graph SDK の統合 ⚠️ DownstreamApi 経由
パフォーマンス ⚡ インプロセス (最速の) 🔄 HTTP オーバーヘッド
Configuration appsettings.json とコード appsettings.json と環境変数
デバッグ ✅ 標準の .NET デバッグ ⚠️ コンテナーのデバッグ
ホット リロード ✅ .NET ホット リロード ❌ コンテナーの再起動
パッケージの更新 📦 NuGet パッケージ 🐳 コンテナー イメージ
ライセンス MIT MIT

各アプローチを使用するタイミング

Microsoft.Identity.Web と Microsoft Entra SDK for AgentID のどちらを決定するかは、アプリケーションの要件、アーキテクチャ、デプロイ戦略によって異なります。 ニーズに応じて、1 つのアプローチが他のアプローチよりも適している場合があり、次のガイドラインは、情報に基づいた意思決定を行うのに役立ちます。

Scenario Microsoft.Identity.Web (In-Process) Microsoft Entra SDK for AgentID (Out-of-Process)
アプリケーション スタック .NET アプリケーション専用
• ASP.NET Core Web API
• ASP.NET Core Web Apps
• .NET Worker Services
• Blazor アプリケーション
• デーモン アプリ
複数言語マイクロサービス
• Node.js、Python、Go、Java サービス
• ポリグロット アーキテクチャ
• Non-.NET サービス
• レガシ システムの統合
パフォーマンス要件 パフォーマンスが重要
• 高スループットのシナリオ
• 待機時間の影響を受けやすい操作
• ミリ秒ごとのカウント
HTTP オーバーヘッドを許容できる
• 最大 1 ~ 5 ミリ秒の追加待機時間が許容可能
• 認証によってボトルネックにならないスループット
統合のニーズ 詳細な統合が必要
• カスタム MSAL.NET 構成
• MSAL 機能への直接アクセス
• 高度なトークン キャッシュ戦略
標準化された統合
• HTTP API で十分
• サービス間で一貫した認証パターン
開発エクスペリエンス 迅速な開発
• クイックプロトタイピング
• 開発用ホットリロード
• 標準の .NET デバッグ
コンテナーベースの開発
• 変更のためのコンテナーの再起動
• コンテナーのデバッグが必要
チームとアーキテクチャ 単一言語スタック
• C#/.NET でのチームの専門知識
• 多言語要件なし
テクノロジの多様性
• フレームワークと言語の組み合わせ
• Polyglot チームの構造
デプロイメント モデル モノリシック展開
• 単一アプリケーションのデプロイ
• 従来のホスティング モデル
コンテナ化によるデプロイメント
• Kubernetes 環境
• Docker Compose のセットアップ
サービス メッシュ アーキテクチャ
Operations 結合認証の更新
• 認証の変更にはアプリのリビルドが必要
• アプリケーションとの共有ライフサイクル
運用上の利点
認証ロジックの独立したスケーリング
• 認証更新プログラムをアプリ コードから分離する
認証の一元的な監視

移行ガイダンス

Microsoft.Identity.Web から Microsoft Entra SDK for AgentID への移行

特定のシナリオでは、Microsoft.Identity.Web を使用して既存の .NET アプリケーションを移行し、認証に Microsoft Entra SDK for AgentID を活用することができます。 移行の理由としては、複数言語アーキテクチャの採用、サービス間での認証の標準化、コンテナー化されたデプロイ モデルへの移行などがあります。

その前に、慎重な検討と計画が必要です。 このセクションでは、アプリケーションの移行に役立つコード例を含む高度な移行パスを示します。

注意事項

Microsoft では、Microsoft.Identity.Web から Microsoft Entra SDK for AgentID に移行することはお勧めしませんが、これを選択した場合は、他の言語とフレームワークでの同様の概念のデモンストレーションを次に示します。

手順 1: SDK コンテナーをデプロイする

まず、SDK コンテナーをポッドに追加する必要があります。

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

手順 2: 構成を移行する

次に、構成を appsettings.json から環境変数に転送する必要があります。

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

After (Kubernetes ConfigMap / 環境変数)

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"

手順 3: アプリケーション コードを更新する

Microsoft.Identity.Web へのインプロセス呼び出しのすべてのインスタンスを見つけ、それらを Microsoft Entra SDK for AgentID エンドポイントへの HTTP 呼び出しに置き換えます。

(IDownstreamApiを使用するC#の)前の状態

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

After (HTTP クライアントを使用する任意の言語):

次のスニペットでは、 /DownstreamApi エンドポイントを使用してユーザー データを取得する Microsoft Entra SDK for AgentID の呼び出しを確認できます。 例は、C# と 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

TypeScript には、次のように同じロジックを実装できます。

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

手順 4: Microsoft.Identity.Web の依存関係を削除する

前の手順が完了したら、Microsoft.Identity.Web で使用されている NuGet パッケージをプロジェクトから削除することで、アプリケーションを整理できます。

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

それでもアプリでトークンを検証する場合は、元の認証構成を完全に削除する必要はありませんが、検証を Microsoft Entra SDK for AgentID に完全に委任することもできます。

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

手順 5: テストと検証

  1. 単体テスト: SDK への HTTP 呼び出しをモックするようにテストを更新する
  2. 統合テスト: ステージングでの SDK 通信のテスト
  3. パフォーマンス テスト: HTTP オーバーヘッドへの影響を測定する
  4. セキュリティ テスト: トークン処理とネットワーク ポリシーを検証する

パフォーマンスに関する考慮事項

SDK のオーバーヘッド

Microsoft Entra SDK for AgentID では、HTTP 通信のオーバーヘッドが発生します。

パフォーマンス係数 インパクト 軽減戦略
Latency localhost 通信の要求あたりの所要時間は 1 ~ 5 ミリ秒 HTTP/2 を使用して接続のオーバーヘッドを削減する
Throughput HTTP 接続プールによって制限される 接続プールを実装して HTTP 接続を再利用する
メモリ 追加のコンテナー メモリのオーバーヘッド 適切な SDK リソースの割り当てを確認する
要求の効率 複雑な操作を行うための多重ラウンドトリップ 可能な限り複数の操作を組み合わせるバッチ要求
トークンのパフォーマンス トークン取得のオーバーヘッドの繰り返し SDK のトークン キャッシュを活用して最適なパフォーマンスを実現する

インプロセス性能

Microsoft.Identity.Web を使用すると、アプリケーションと同じプロセス内で実行されるため、オーバーヘッドは最小限に抑えられます。ネイティブ メソッド呼び出しでは、HTTP の制限なしにマイクロ秒の待機時間と共有プロセス メモリが提供されます。 パフォーマンスが重要な場合は、インプロセス統合が最適な選択肢ですが、Microsoft Entra SDK for AgentID の柔軟性と言語に依存しない設計は、多くのシナリオでパフォーマンスのトレードオフを上回る可能性があります。

インプロセス使用と Microsoft Entra SDK for AgentID (Out-of-Process) の使用に関するパフォーマンスとコストの比較を次に示します。

コストに関する考慮事項

コストファクター Microsoft.Identity.Web (In-Process) Microsoft Entra SDK for AgentID (Out-of-Process)
計算する アプリケーション プロセスでの追加 CPU/メモリの最小化 ポッドあたりの追加のコンテナー リソース
Network 追加のオーバーヘッドなし 最小 (ローカルホスト通信)
ストレージ NuGet パッケージ サイズ (最大 10 MB) コンテナー イメージ ストレージ
管理 追加のオーバーヘッドなし コンテナー オーケストレーションのオーバーヘッド

コストの例

128Mi/100m SDK 構成の 10 個のレプリカの場合:

Resource 処理中 Microsoft Entra SDK for AgentID
メモリ 約0MBの追加 10 × 128Mi = 1.28 GB
CPU 約0%追加 10 × 100m = 1 コア
ストレージ デプロイあたり最大 10 MB ノードあたりのコンテナー イメージ のサイズ

サポートとメンテナンス

特徴 Microsoft.Identity.Web Microsoft Entra SDK for AgentID
Updates NuGet パッケージの更新 コンテナー イメージの更新
重大な変更 パッケージのバージョニング経由で コンテナー タグを使用する
バグ修正 コンパイル時の統合 ランタイム コンテナーの更新
セキュリティ パッチ アプリケーションのリビルド コンテナーを再デプロイする
ドキュメンテーション 広範な .NET ドキュメント このドキュメント
Community 大規模な .NET コミュニティ 成長するコミュニティ

ハイブリッド アプローチ

同じアーキテクチャ内で両方の方法を組み合わせることができます。最大のパフォーマンスを必要とする .NET サービスには Microsoft.Identity.Web を使用し、non-.NET サービスには Microsoft Entra SDK for AgentID を利用するか、言語に依存しない認証パターンが必要な場合に使用します。 このハイブリッド戦略を使用すると、サービス エコシステム全体の一貫性と柔軟性を維持しながら、重要な場合にパフォーマンスを最適化できます。

アーキテクチャの例を次に示します。

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

次のステップ