AppAuthentication to Azure.Identity Migration Guidance

Microsoft.Azure.Services.AppAuthentication ライブラリが 2017 年秋に初めてリリースされたとき、ソース コードでの資格情報の一般的かつ全身的な問題を軽減するために特別に設計されました。 開発者がコードを 1 回記述し、クライアント ライブラリがアプリケーション環境に基づいて認証する方法を決定できるようにする 、アプリ開発の新しいパラダイム が導入されました。これは、開発者のアカウントを使用する開発者ワークステーション上か、マネージド サービス ID を使用して Azure にデプロイされているかに関係なく、アプリケーション環境に基づいて認証する方法を決定できるようにします AppAuthentication 。 開発者は、資格情報がソース コードで誤って開示されるのを防ぐことで、開発の簡素化とセキュリティの向上の両方で、資格情報を直接処理することを完全に回避できます。 そのシンプルさとセキュリティ上の利点を考えると、 AppAuthentication 開発者は好評を得ました。 NuGet は 1 億 6,000 万を超えるダウンロードを受け取り、.NET Core の Azure Key Vault 構成プロバイダーMicrosoft.Azure.ServiceBus SDK など、Azure サービスの他のライブラリとフレームワークで使用されていました。

2019 年秋にリリースされた Azure.Identity クライアント ライブラリ は、ライブラリの精神的な後継です AppAuthentication 。 Azure.Identity は、複数の言語で広範な可用性を備え、これらの言語全体で一貫した設計と同様の使用を提供するよりも大きな利点 AppAuthentication があります。一方 AppAuthentication 、.NET でのみ使用できます。 Azure.Identity の 1 つの主要な設計機能は、複数の言語のサポートに加えて、 新しい Azure クライアント SDK が受け入れる抽象 TokenCredential クラスのさまざまな実装です。 これらの新しい Azure SDK は、"Azure"、つまり "Azure.Identity"、"Azure.Storage.Blobs" で始まるパッケージ名と名前空間によって簡単に区別されます。 認証するために、目的の種類の TokenCredential オブジェクトがインスタンス化され、Azure SDK クライアント クラスに直接渡されます。 この設計により、Azure.Identity を使用すると、アクセス トークンをアプリケーション自体で直接処理する必要がないため、アクセス トークンを指定する必要がある AppAuthentication と古い SDK を使用するよりも、追加のセキュリティ上の利点が得られます。 これにより、アクセス トークンがトレース、ログ、およびその他のソースを介して誤って開示されるリスクがさらに軽減されます。

新しいアプリケーションの開発を開始する場合は、新しい Azure クライアント SDK と を使用 Azure.Identity することを強くお勧めします。 AppAuthentication を使用する既存のアプリケーションがあり、Azure.Identity を使用する場合は、TokenCredentials の受け入れをサポートする新しい Azure クライアント SDK を使用するようにアプリケーションを更新することをお勧めします。 AppAuthentication は非推奨と見なされ、開発にそれ以上の投資は行われません。 で Azure.IdentityDefaultAzureCredential使用すると、 とAppAuthentication同様の機能AzureServiceTokenProviderが提供されます。ここで、使用される認証プロバイダーは現在の環境に基づいて変更されます。 を使用して特定の認証プロバイダーAppAuthenticationの接続文字列をAppAuthentication使用している場合は、次の表を参照して、Azure.Identity で適切な TokenCredential を作成して、同じ認証プロバイダーを使用する方法を確認してください。

認証プロバイダー AppAuthentication
Connection String
Azure.Identity
TokenCredential
(既定) 環境ベース 既定値 - 接続文字列は使用されません new DefaultAzureCredential()*
Azure CLI RunAs=Developer;
DeveloperTool=AzureCli
new AzureCliCredential()
Visual Studio RunAs=Developer;DeveloperTool=VisualStudio new VisualStudioCredential()
Windows 統合認証 RunAs=CurrentUser サポートなし
システム割り当てマネージド ID RunAs=App new ManagedIdentityCredential()
ユーザー割り当てマネージド ID RunAs=App;AppId=appId new ManagedIdentityCredential(appId)
サービス プリンシパル クライアント証明書 RunAs=App;AppId=appId;
KeyVaultCertificateSecretIdentifier=kvIdentifier
サポートなし
サービス プリンシパル クライアント証明書 RunAs=App;AppId=appId;TenantId=tenantId;
CertificateThumbprint=thumbprint;
CertificateStoreLocation=location
new EnvironmentCredential()**
new ClientCertificateCredential(tenantId, appId, certObjOrFilePath)
サービス プリンシパル クライアント証明書 RunAs=App;AppId=appId;TenantId=tenantId;
CertificateSubjectName=subject;
CertificateStoreLocation=location
new EnvironmentCredential()**
new ClientCertificateCredential(tenantId, appId, certObjOrFilePath)
サービス プリンシパル クライアント シークレット RunAs=App;AppId=appId;TenantId=tenantId;
AppKey=secret
new EnvironmentCredential()**
new ClientSecretCredential(tenantId, appId, secret)

Note

*認証プロバイダーと順序は、AzureServiceTokenProviderDefaultAzureCredential で異なります
**環境変数を設定する必要がある

Azure.Identity では、AppAuthentication に含まれるほとんどの認証シナリオとプロバイダーがサポートされていますが、現在サポートされていないシナリオと機能がいくつかあります。

  • Windows 統合認証プロバイダー

  • System.Data.SqlClient.SqlAuthenticationProvider 実装 (SqlAppAuthenticationProvider)

    • Microsoft.Data.SqlClient については、「 Active Directory の既定の認証」を参照してください。 この認証モードは、DEFAULTAzureCredential を使用して SQL インスタンスへの認証用のアクセス トークンを取得する場合と同様の機能を提供します。
  • 証明書ストア内の証明書をクライアント資格情報として直接使用する (サブジェクト名または拇印識別子を使用)

  • Key Vaultの証明書をクライアント資格情報として直接使用する (証明書シークレット識別子Key Vault使用)

  • 環境構成を使用して認証プロバイダーを変更する (つまり、AppAuthentication の接続文字列)

    • DefaultAzureCredential と EnvironmentCredential を使用した Azure.Identity での制限付きサポートについては、「環境変数」を参照してください
  • 環境ベースの認証に使用される認証プロバイダーと ID を決定する (つまり、AzureServiceTokenProvider.PrincipalUsed プロパティ)

    • AzureEventSourceListener を使用して、Azure.Identity で DefaultAzureCredential で使用される認証プロバイダーを特定できます

AppAuthentication を使用して古い Azure クライアント SDK から、Azure.Identity を使用して新しいバージョンの Azure クライアント SDK に移行する例を次に示します。 Azure.Identity を使用するコードは、AppAuthentication コードよりもはるかに単純ではなく、多くの場合に使用されます

Microsoft.Azure.KeyVault から Azure.Security.KeyVault へ:

  • ライブラリの使用AppAuthentication
AzureServiceTokenProvider tokenProvider = new AzureServiceTokenProvider();
var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(tokenProvider.KeyVaultTokenCallback));
var secretBundle = await client.GetSecretAsync("https://keyvaultname.vault.azure.net/secrets/secretname");

Console.WriteLine(secretBundle.Value);
  • ライブラリの使用Azure.Identity
var client = new SecretClient(new Uri("https://keyvaultname.vault.azure.net"), new DefaultAzureCredential());
var secret = client.GetSecret("secretName").Value;

Console.WriteLine(secret.Value);

Microsoft.Azure.Storage.Queues から Azure.Storage.Queues へ:

  • ライブラリの使用AppAuthentication
var tokenProvider = new AzureServiceTokenProvider();
var accessToken = await tokenProvider.GetAccessTokenAsync("https://storageaccountname.queue.core.windows.net");

var tokenCredential = new StorageTokenCredential(accessToken);
var storageCredentials = new StorageCredentials(tokenCredential);

var uri = new StorageUri(new Uri("https://storageaccountname.queue.core.windows.net"));
var client = new CloudQueueClient(uri, storageCredentials);

var queue = client.GetQueueReference("queuename");
queue.AddMessage(new CloudQueueMessage("Microsoft.Azure.Storage.Queues"));
  • ライブラリの使用Azure.Identity
QueueClient queueClient = new QueueClient(new Uri("https://storageaccountname.queue.core.windows.net/queuename"), new DefaultAzureCredential());
queueClient.SendMessage("Azure.Storage.Queues");

アクセス トークンの取得

  • ライブラリの使用AppAuthentication
var tokenProvider = new AzureServiceTokenProvider();
var accessToken = await tokenProvider.GetAccessTokenAsync(ResourceId);
  • ライブラリの使用Azure.Identity
var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
    new TokenRequestContext(scopes: new string[] { ResourceId + "/.default" }) { }
);

Note

スコープの .default 詳細については、 こちらを参照してください