このガイドでは、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: テストと検証
- 単体テスト: SDK への HTTP 呼び出しをモックするようにテストを更新する
- 統合テスト: ステージングでの SDK 通信のテスト
- パフォーマンス テスト: HTTP オーバーヘッドへの影響を測定する
- セキュリティ テスト: トークン処理とネットワーク ポリシーを検証する
パフォーマンスに関する考慮事項
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
次のステップ
- インストール ガイド - Microsoft Entra SDK for AgentID の展開
- 構成リファレンス - SDK を構成する
- シナリオ - 実際の例
- Microsoft.Identity.Web ドキュメント - インプロセス ライブラリについて