.NET向けAzure Identityライブラリ
Microsoft Entra IDを使用してAzure SDKクライアントを認証するためのライブラリです。
インストール
dotnet add package Azure.Identity
# ASP.NET Core統合用
dotnet add package Microsoft.Extensions.Azure
# ブローカー認証とVisual Studio Code資格情報サポート用
dotnet add package Azure.Identity.Broker
環境変数
シークレットを使用したサービスプリンシパル
AZURE_CLIENT_ID=<アプリケーションクライアントID>
AZURE_TENANT_ID=<ディレクトリテナントID>
AZURE_CLIENT_SECRET=<クライアントシークレット値>
証明書を使用したサービスプリンシパル
AZURE_CLIENT_ID=<アプリケーションクライアントID>
AZURE_TENANT_ID=<ディレクトリテナントID>
AZURE_CLIENT_CERTIFICATE_PATH=<pfxまたはpemファイルへのパス>
AZURE_CLIENT_CERTIFICATE_PASSWORD=<証明書パスワード> # オプション
マネージドID
AZURE_CLIENT_ID=<ユーザー割り当てマネージドIDのクライアントID> # ユーザー割り当ての場合のみ
DefaultAzureCredential
ほとんどのシナリオで推奨される資格情報です。複数の認証方法を順番に試行します。現在の資格情報チェーンの順序とデフォルトについては、DefaultAzureCredentialの概要を参照してください。
基本的な使用方法
using Azure.Identity;
using Azure.Storage.Blobs;
var credential = new DefaultAzureCredential();
var blobClient = new BlobServiceClient(
new Uri("https://myaccount.blob.core.windows.net"),
credential);
ASP.NET Coreでの依存性注入
using Azure.Identity;
using Microsoft.Extensions.Azure;
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://myaccount.blob.core.windows.net"));
clientBuilder.AddSecretClient(
new Uri("https://myvault.vault.azure.net"));
// デフォルトでDefaultAzureCredentialを使用
clientBuilder.UseCredential(new DefaultAzureCredential());
});
DefaultAzureCredentialのカスタマイズ
var credential = new DefaultAzureCredential(
new DefaultAzureCredentialOptions
{
ExcludeEnvironmentCredential = true,
ExcludeManagedIdentityCredential = false,
ExcludeVisualStudioCredential = false,
ExcludeAzureCliCredential = false,
ExcludeInteractiveBrowserCredential = false, // インタラクティブを有効化
TenantId = "<テナントID>",
ManagedIdentityClientId = "<ユーザー割り当てMIクライアントID>"
});
資格情報の種類
ManagedIdentityCredential(本番環境)
// システム割り当てマネージドID
var credential = new ManagedIdentityCredential(ManagedIdentityId.SystemAssigned);
// クライアントIDによるユーザー割り当て
var credential = new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedClientId("<クライアントID>"));
// リソースIDによるユーザー割り当て
var credential = new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedResourceId("<リソースID>"));
// オブジェクトIDによるユーザー割り当て
var credential = new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedObjectId("<オブジェクトID>"));
ClientSecretCredential
var credential = new ClientSecretCredential(
tenantId: "<テナントID>",
clientId: "<クライアントID>",
clientSecret: "<クライアントシークレット>");
var client = new SecretClient(
new Uri("https://myvault.vault.azure.net"),
credential);
ClientCertificateCredential
var certificate = X509CertificateLoader.LoadCertificateFromFile("MyCertificate.pfx");
var credential = new ClientCertificateCredential(
tenantId: "<テナントID>",
clientId: "<クライアントID>",
certificate);
ChainedTokenCredential(カスタムチェーン)
var credential = new ChainedTokenCredential(
new ManagedIdentityCredential(),
new AzureCliCredential());
var client = new SecretClient(
new Uri("https://myvault.vault.azure.net"),
credential);
開発者資格情報
// Azure CLI
var credential = new AzureCliCredential();
// Azure PowerShell
var credential = new AzurePowerShellCredential();
// Azure Developer CLI (azd)
var credential = new AzureDeveloperCliCredential();
// Visual Studio
var credential = new VisualStudioCredential();
// インタラクティブブラウザ
var credential = new InteractiveBrowserCredential();
環境ベースの設定
// 本番環境 vs 開発環境
TokenCredential credential = builder.Environment.IsProduction()
? new ManagedIdentityCredential("<クライアントID>")
: new DefaultAzureCredential();
Sovereignクラウド
var credential = new DefaultAzureCredential(
new DefaultAzureCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzureGovernment
});
// 利用可能なAuthorityHost:
// AzureAuthorityHosts.AzurePublicCloud (デフォルト)
// AzureAuthorityHosts.AzureGovernment
// AzureAuthorityHosts.AzureChina
資格情報の種類リファレンス
| カテゴリ | 資格情報 | 目的 |
|---|---|---|
| チェーン | DefaultAzureCredential | 開発から本番への事前設定済みチェーン |
ChainedTokenCredential | カスタム資格情報チェーン | |
| Azureホスティング | ManagedIdentityCredential | AzureマネージドID |
WorkloadIdentityCredential | KubernetesワークロードID | |
EnvironmentCredential | 環境変数 | |
| サービスプリンシパル | ClientSecretCredential | クライアントID + シークレット |
ClientCertificateCredential | クライアントID + 証明書 | |
ClientAssertionCredential | 署名付きクライアントアサーション | |
| ユーザー | InteractiveBrowserCredential | ブラウザベースの認証 |
DeviceCodeCredential | デバイスコードフロー | |
OnBehalfOfCredential | 委任されたID | |
| 開発者 | AzureCliCredential | Azure CLI |
AzurePowerShellCredential | Azure PowerShell | |
AzureDeveloperCliCredential | Azure Developer CLI | |
VisualStudioCredential | Visual Studio |
ベストプラクティス
1. 本番環境では決定論的な資格情報を使用する
// 開発環境
var devCredential = new DefaultAzureCredential();
// 本番環境 - 特定の資格情報を使用
var prodCredential = new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedClientId("<クライアントID>"));
2. 資格情報インスタンスを再利用する
// 良い例: 単一の資格情報インスタンスを複数のクライアントで共有
var credential = new DefaultAzureCredential();
var blobClient = new BlobServiceClient(blobUri, credential);
var secretClient = new SecretClient(vaultUri, credential);
3. 再試行ポリシーを設定する
var options = new ManagedIdentityCredentialOptions(
ManagedIdentityId.FromUserAssignedClientId(clientId))
{
Retry =
{
MaxRetries = 3,
Delay = TimeSpan.FromSeconds(0.5),
}
};
var credential = new ManagedIdentityCredential(options);
4. デバッグのためにログ記録を有効にする
using Azure.Core.Diagnostics;
using AzureEventSourceListener listener = new((args, message) =>
{
if (args is { EventSource.Name: "Azure-Identity" })
{
Console.WriteLine(message);
}
}, EventLevel.LogAlways);
エラーハンドリング
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
var client = new SecretClient(
new Uri("https://myvault.vault.azure.net"),
new DefaultAzureCredential());
try
{
KeyVaultSecret secret = await client.GetSecretAsync("secret1");
}
catch (AuthenticationFailedException e)
{
Console.WriteLine($"認証に失敗しました: {e.Message}");
}
catch (CredentialUnavailableException e)
{
Console.WriteLine($"資格情報が利用できません: {e.Message}");
}
主要な例外
| 例外 | 説明 |
|---|---|
AuthenticationFailedException | 認証エラーの基本例外 |
CredentialUnavailableException | 現在の環境で資格情報が認証できない |
AuthenticationRequiredException | インタラクティブ認証が必要 |
マネージドIDのサポート
サポートされているAzureサービス:
- Azure App ServiceおよびAzure Functions
- Azure Arc
- Azure Cloud Shell
- Azure Kubernetes Service (AKS)
- Azure Service Fabric
- Azure Virtual Machines
- Azure Virtual Machine Scale Sets
スレッドセーフ
すべての資格情報の実装はスレッドセーフです。単一の資格情報インスタンスは、複数のクライアントやスレッド間で安全に共有できます。
関連パッケージ
| パッケージ | 目的 | インストール |
|---|---|---|
Azure.Identity | 認証(このライブラリ) | dotnet add package Azure.Identity |
Microsoft.Extensions.Azure | DI統合 | dotnet add package Microsoft.Extensions.Azure |
Azure.Identity.Broker | ブローカー認証 | dotnet add package Azure.Identity.Broker |