アプリケーションがMicrosoft ID プラットフォームで認証されると、その ID を証明するための資格情報が提示されます。 Microsoft。Identity.Web では、複数の資格情報の種類がサポートされており、それぞれ異なる環境とセキュリティ要件に適しています。
この記事では、使用可能な資格情報の種類を理解し、シナリオに適した資格情報を選択し、アプリケーションで資格情報を構成する方法について説明します。
資格情報の選択が重要な理由
アプリケーションが使用する資格情報は、セキュリティ体制、運用上のオーバーヘッド、デプロイの柔軟性に直接影響します。 資格情報が適切に選択されていないと、シークレットが公開されたり、手動でローテーションされたり、アプリケーションを実行できる場所が制限されたりする可能性があります。
Microsoft。Identity.Web には、次のことが可能な統合構成モデルが用意されています。
- 自動フォールバックを使用して複数の資格情報を指定します。
- アプリケーション コードを変更せずに資格情報の種類を変更します。
- 環境ごとに異なる資格情報 (開発、ステージング、運用) を使用します。
サポートされている資格情報の種類
Microsoft。Identity.Web では、機密クライアント アプリケーションの資格情報の 3 つのカテゴリがサポートされています。
証明書なしの資格情報 (フェデレーション ID 資格情報 + マネージド ID)
証明書なしの資格情報では、Azureマネージド ID とフェデレーション ID 資格情報 (FIC) を組み合わせて使用し、シークレットや証明書を管理せずにアプリケーションを認証します。 Azureは、資格情報のライフサイクル全体を処理します。
動作方法:アプリケーションは、そのマネージド ID を使用してトークンを取得します。このトークンは、Microsoft ID プラットフォームが事前に構成されたフェデレーション信頼を通じてアプリケーションの ID の証明として受け入れます。
Azureで実行されている運用ワークロードの最適です。
証明書
証明書は、強力な非対称キーベースの認証を提供します。 アプリケーションは、証明書の秘密キーを使用してアサーションに署名することで、その ID を証明します。 Microsoft。Identity.Web では、複数のソースから証明書を読み込むことができます。
- Azure Key Vault - アクセス ポリシーを使用した一元化されたマネージド証明書ストレージ。
- Certificate Store - Windows証明書ストア (CurrentUser または LocalMachine)。
- ファイル パス - ディスク上の証明書ファイル (.pfx 形式)。
- Base64 エンコード - 構成に直接埋め込まれた証明書。
次の場合に最適です。 証明書なしの資格情報を使用できない運用ワークロード、またはハイブリッド環境。
クライアント シークレット
クライアント シークレットは、アプリケーションがMicrosoft ID プラットフォームに提示する共有文字列です。 これらは構成する最も簡単な資格情報の種類ですが、最も弱いセキュリティを提供します。
次の場合に最適です。 ローカル開発とテストのみ。
適切な資格情報の種類を選択する
次のデシジョン ツリーを使用して、シナリオに適した資格情報の種類を決定します。
Is your application running on Azure?
├── Yes
│ ├── Can you use Managed Identity?
│ │ ├── Yes → Use certificateless credentials (recommended)
│ │ └── No → Use certificates from Azure Key Vault
└── No
├── Is this a production environment?
│ ├── Yes → Use certificates (Key Vault, Certificate Store, or file path)
│ └── No → Use client secrets for development/testing
一般的なガイダンス
資格情報の種類を選択するときは、次の原則に従います。
- アプリケーションがAzureで実行される場合、常に証明書レスの資格情報を優先します。 資格情報の管理を完全に排除します。
- 証明書 なしの資格情報を使用できない場合は、証明書を使用します。 可能な限り、Azure Key Vaultに保存してください。
- クライアント シークレットを開発環境に制限します。 運用環境のデプロイではクライアント シークレットを使用しないでください。
資格情報の種類を比較する
次の表は、資格情報の種類の主な違いをまとめたものです。
| 特徴 | 証明書なし (FIC + MI) | 証明書 | クライアント シークレット |
|---|---|---|---|
| セキュリティ レベル | 最高 | 高 | 低 |
| 秘密の露出リスク | なし - 漏洩するシークレットなし | 低 - 秘密キーが保護されている | 高 - 文字列をコピーできます |
| 回転が必要 | いいえ - Azureはライフサイクルを管理します | はい - 証明書の有効期限が切れる前 | はい - シークレットの有効期限が切れる前 |
| 回転の複雑さ | なし | 中 - 証明書の更新、再デプロイ | 低 - 文字列を更新して再配置 |
| Azure ポータルのセットアップ | マネージド アイデンティティ + FIC トラスト | 証明書をアプリ登録にアップロードする | アプリ登録でシークレットを生成する |
| 適切な環境 | Azureプロダクション | 任意の運用環境 | 開発とテストのみ |
| インフラストラクチャの依存関係 | Azure コンピューティング リソース | 証明書ストアまたはKey Vault | なし |
| コンプライアンス | ゼロトラスト要件を満たす | ほとんどのコンプライアンス フレームワークを満たす | セキュリティ ポリシーを満たしていない可能性があります |
appsettings.json で資格情報を構成する
Microsoft。Identity.Web では、構成で ClientCredentials 配列を使用して、1 つ以上の資格情報を指定します。 配列内の各エントリには、資格情報の取得元を示す SourceType プロパティが含まれています。
構成構造
次の例は、1 つの証明書なしの資格情報を使用した最小限の構成を示しています。
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-client-id",
"ClientCredentials": [
{
"SourceType": "SignedAssertionFromManagedIdentity",
"ManagedIdentityClientId": "user-assigned-managed-identity-client-id"
}
]
}
}
SourceTypeの値
SourceType プロパティはCredentialSource 列挙型に対応し、Microsoft.Identity.Web が資格情報をどのように読み込むかを決定します。
| SourceType の値 | 認証タイプ | 説明 |
|---|---|---|
SignedAssertionFromManagedIdentity |
証明書なし | マネージド ID を使用して署名付きアサーションを取得します。 Azure運用環境に推奨されます。 |
KeyVault |
証書 | URI でAzure Key Vaultから証明書を読み込みます。 |
StoreWithThumbprint |
証書 | 拇印によってWindows証明書ストアから証明書を読み込みます。 |
StoreWithDistinguishedName |
証書 | サブジェクト識別名を使用して、Windows証明書ストアから証明書を読み込みます。 |
Path |
証書 | ディスク上の .pfx ファイルから証明書を読み込みます。 |
Base64Encoded |
証書 | 構成で Base64 でエンコードされた文字列から証明書を読み込みます。 |
ClientSecret |
クライアント シークレット | クライアント シークレット文字列を使用します。 |
AutoDecryptKeys |
トークンの暗号化解除 | 暗号化されたトークンを復号化するためのキーを自動的に取得します。 |
SignedAssertionFilePath |
フェデレーテッド | (Kubernetes ワークロード ID の場合) ファイル パスから署名付きアサーションを読み取ります。 |
種類別の資格情報の例
次の例は、 appsettings.json で各資格情報の種類を構成する方法と、使用可能な場合は C# コードで構成する方法を示しています。
証明書なしの (マネージド ID)
クライアント ID を指定することによって、ユーザー割り当てマネージド ID を使用します。
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-client-id",
"ClientCredentials": [
{
"SourceType": "SignedAssertionFromManagedIdentity",
"ManagedIdentityClientId": "user-assigned-managed-identity-client-id"
}
]
}
}
システム割り当てマネージド ID の場合は、 ManagedIdentityClientId プロパティを省略します。
{
"AzureAd": {
"ClientCredentials": [
{
"SourceType": "SignedAssertionFromManagedIdentity"
}
]
}
}
Azure Key Vaultからの証明書
コンテナーの URL と証明書名を指定して、Azure Key Vaultに格納されている証明書を読み込みます。
{
"AzureAd": {
"ClientCredentials": [
{
"SourceType": "KeyVault",
"KeyVaultUrl": "https://your-keyvault.vault.azure.net",
"KeyVaultCertificateName": "your-certificate-name"
}
]
}
}
C# で CredentialDescription ヘルパー メソッドを使用することもできます。
var credential = CredentialDescription.FromKeyVault(
"https://your-keyvault.vault.azure.net",
"your-certificate-name");
証明書ストアからの証明書
拇印を使用してWindows証明書ストアから証明書を読み込みます。
{
"AzureAd": {
"ClientCredentials": [
{
"SourceType": "StoreWithThumbprint",
"CertificateThumbprint": "ABC123DEF456...",
"CertificateStorePath": "CurrentUser/My"
}
]
}
}
識別名を使用することもできます。これにより、新しい証明書が自動的に選択されるため、証明書のローテーションが簡略化されます。
{
"AzureAd": {
"ClientCredentials": [
{
"SourceType": "StoreWithDistinguishedName",
"CertificateDistinguishedName": "CN=YourAppCertificate",
"CertificateStorePath": "CurrentUser/My"
}
]
}
}
C# では、ヘルパー メソッドを使用します。
// By thumbprint
var credential = CredentialDescription.FromCertificateStore(
"CurrentUser/My",
thumbprint: "ABC123DEF456...");
// By distinguished name (recommended for rotation)
var credential = CredentialDescription.FromCertificateStore(
"CurrentUser/My",
distinguishedName: "CN=YourAppCertificate");
ファイル パスからの証明書
ディスク上の .pfx ファイルから証明書を読み込みます。
{
"AzureAd": {
"ClientCredentials": [
{
"SourceType": "Path",
"CertificateDiskPath": "/var/certs/app-cert.pfx",
"CertificatePassword": "certificate-password"
}
]
}
}
Warnung
証明書パスワードを appsettings.jsonに直接保存しないようにします。 機密値には、ASP.NET Core Secret Manager、環境変数、またはAzure Key Vaultを使用します。
Base64 でエンコードされた証明書
Base64 でエンコードされた文字列として証明書を構成に直接埋め込みます。
{
"AzureAd": {
"ClientCredentials": [
{
"SourceType": "Base64Encoded",
"Base64EncodedValue": "MIIKcQIBAzCCCi0..."
}
]
}
}
クライアント シークレット
開発およびテスト用のクライアント シークレット文字列を指定します。
{
"AzureAd": {
"ClientCredentials": [
{
"SourceType": "ClientSecret",
"ClientSecret": "your-client-secret"
}
]
}
}
注意事項
クライアント シークレットは、開発中にのみ使用する必要があります。 シークレットをソース管理にコミットしたり、運用環境にデプロイしたりしないでください。
フォールバック機能を使用して複数の資格情報を使用する
ClientCredentials配列には複数の資格情報を指定できます。 Microsoft。Identity.Web は、各資格情報を順番に試行し、現在の資格情報が失敗した場合は次の資格情報にフォールバックします。 このパターンは、複数の環境で実行されるアプリケーションに役立ちます。
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-client-id",
"ClientCredentials": [
{
"SourceType": "SignedAssertionFromManagedIdentity",
"ManagedIdentityClientId": "your-managed-identity-client-id"
},
{
"SourceType": "KeyVault",
"KeyVaultUrl": "https://your-keyvault.vault.azure.net",
"KeyVaultCertificateName": "your-certificate-name"
},
{
"SourceType": "ClientSecret",
"ClientSecret": "development-only-secret"
}
]
}
}
この例は次のとおりです。
- アプリケーションはまず、マネージド ID を使用して証明書なしの認証を試みます (Azureで動作します)。
- マネージド ID が使用できない場合は、Key Vaultから証明書にフォールバックします。
- 最後の手段として、クライアント シークレット (ローカル開発用) を使用します。
この方法では、コードを変更することなく、環境間で同じ構成ファイルを使用できます。
コードで資格情報を構成する
Program.csまたはStartup.csで、プログラムで資格情報を構成することもできます。
using Microsoft.Identity.Web;
builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("MyApi", builder.Configuration.GetSection("MyApi"))
.AddDistributedTokenCaches();
// Or configure credentials programmatically
builder.Services.Configure<MicrosoftIdentityOptions>(options =>
{
options.ClientCredentials = new[]
{
new CredentialDescription
{
SourceType = CredentialSource.SignedAssertionFromManagedIdentity,
ManagedIdentityClientId = "your-managed-identity-client-id"
}
};
});
トークン暗号化解除資格情報
認証用のクライアント資格情報を超えて、Microsoft。Identity.Web では、トークン暗号化解除の資格情報もサポートされています。 アプリケーションが暗号化されたトークンを受け取り、暗号化を解除する必要がある場合は、トークン暗号化解除資格情報を使用します。
トークン復号化資格情報では、クライアント資格情報と同じ SourceType 値と構成パターンが使用されますが、 TokenDecryptionCredentials 配列で指定されます。
{
"AzureAd": {
"TokenDecryptionCredentials": [
{
"SourceType": "KeyVault",
"KeyVaultUrl": "https://your-keyvault.vault.azure.net",
"KeyVaultCertificateName": "token-decryption-cert"
}
]
}
}
ベスト プラクティス
アプリケーションの資格情報を構成するときは、次の推奨事項に留意してください。
運用環境では証明書なしの資格情報を優先します。 秘密情報の露出リスクを排除し、ローテーションによる負荷を軽減する。 マネージド ID をサポートAzureコンピューティング リソースでアプリケーションが実行されるたびに使用します。
移植性のために資格情報フォールバックを使用します。 コードを変更せずに開発、ステージング、運用全体でアプリケーションが動作するように、複数の資格情報を優先度順に構成します。
運用環境ではクライアント シークレットを使用しないでください。 クライアント シークレットは、ログ、構成ファイル、またはソース管理によってリークする可能性があります。 代わりに、証明書または証明書なしの資格情報を使用してください。
機密性の高い値を構成ファイルの外部に格納します。 証明書パスワードとクライアント シークレットには、Azure Key Vault、環境変数、または ASP.NET Core Secret Manager を使用します。 機密性の高い値をソース管理にコミットしないでください。
有効期限が切れる前に証明書をローテーションします。 証明書の有効期限を監視し、ローテーション プロセスを確立します。 Azure Key Vaultは、証明書の更新を自動化できます。
証明書ストレージにはAzure Key Vaultを使用します。 Key Vaultでは、一元管理、アクセス ポリシー、監査ログ、証明書の自動ローテーションが提供されます。