このガイドは、アプリケーションで認証を処理する際の 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: テストと検証
- 単体テスト: SDK への HTTP 呼び出しをモックするようにテストを更新します。
- 統合テスト: ステージングで SDK 通信をテストします。
- パフォーマンス テスト: HTTP オーバーヘッドへの影響を測定します。
- セキュリティ テスト: トークンの処理とネットワーク ポリシーを検証します。
パフォーマンスに関する考慮事項
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