比較: Microsoft Entra SDK for Agent ID と In-Process Microsoft。Identity.Web

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

アーキテクチャの違い

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

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

Microsoft.Identity.Web (インプロセス)

このコードスニペットは、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 Agent ID (アウトオブプロセス)

このコード スニペットは、HTTP を使用して Node.js アプリケーションから Microsoft Entra SDK for Agent ID を呼び出す方法を示しています。 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 Agent ID
言語サポート C# / .NETのみ 任意の言語 (HTTP)
Deployment プロセス内ライブラリ 個別のコンテナー
トークンの取得 MSAL.NET を直接に HTTP API 経由
トークン キャッシュ インメモリ型、分散型 メモリ内、分散型
OBO フロー ネイティブ サポート HTTP エンドポイント経由
クライアント資格情報 ネイティブ サポート HTTP エンドポイント経由
マネージド ID 直接サポート 直接サポート
エージェント ID 拡張機能によって クエリ パラメーター
トークンの検証 ミドルウェア /Validate endpoint
ダウンストリーム 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 Agent IDのどちらを選択するかは、アプリケーションの要件、アーキテクチャ、およびデプロイメント戦略によって異なります。 ニーズに応じて、一方のアプローチが他のアプローチよりも適している場合があります。 次のガイドラインは、情報に基づいた意思決定を行う際に役立ちます。

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

移行ガイダンス

AgentIDのためにMicrosoft.Identity.WebからMicrosoft Entra SDKへ移行

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

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

注意事項

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 へのインプロセス呼び出しのすべてのインスタンスを見つけ、エージェント ID エンドポイントに対する Microsoft Entra SDK への 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 Agent ID を呼び出してユーザー データを取得します。 例は、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 Agent ID では、HTTP 通信のオーバーヘッドが発生します。

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

処理中のパフォーマンス

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

次の表は、インプロセスの使用状況とエージェント ID (アウトオブプロセス) のMicrosoft Entra SDK のパフォーマンスとコストの比較を示しています。

コストに関する考慮事項

コストファクター Microsoft.Identity.Web (In-Process) Microsoft Entra SDK for Agent ID (プロセス外)
計算する アプリケーション プロセスでの追加の CPU とメモリを最小限に抑えます ポッドあたりの追加のコンテナー リソース。
Network 追加のオーバーヘッドなし 最小限の localhost 通信。
ストレージ NuGet パッケージ サイズ (最大 10 MB) コンテナー イメージ ストレージ。
管理 追加のオーバーヘッドなし コンテナー オーケストレーションのオーバーヘッド。

コストの例

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

Resource 処理中 Microsoft Entra SDK(Agent ID向け)
メモリ 約 0 MB の追加 10 × 128 MiB = 1.28 GB
CPU 約0%追加 10 × 100m = 1 コア
ストレージ デプロイあたりおおよそ 10 MB ノードあたりのコンテナー イメージ のサイズ

サポートとメンテナンス

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

ハイブリッド アプローチ

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

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

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