オンプレミスでホストされている .NET アプリから Azure リソースに対して認証する
Azure の外部 (オンプレミスやサード パーティのデータ センターなど) でホストされているアプリは、Azure リソースにアクセスするときに、アプリケーション サービス プリンシパルを使用して Azure に対する認証を行う必要があります。 アプリケーション サービス プリンシパル オブジェクトは、Azure のアプリ登録プロセスを使用して作成されます。 アプリケーション サービス プリンシパルが作成されると、アプリのクライアント ID とクライアント シークレットが生成されます。 その後、クライアント ID、クライアント シークレット、テナント ID が環境変数に格納され、実行時にアプリを Azure に対して認証するために Azure Identity ライブラリで使用できるようになります。
アプリがホストされている環境ごとに異なるアプリ登録を作成する必要があります。 これにより、各サービス プリンシパルに対して環境固有のリソース アクセス許可が構成され、ある環境にデプロイされたアプリが、別の環境の一部である Azure リソースと通信しないようにすることができます。
1 - Azure にアプリケーションを登録する
アプリは、Azure portal または Azure CLI を使用して Azure に登録できます。
Azure portal にサインインして、次の手順を実行します。
2 - アプリケーション サービス プリンシパルにロールを割り当てる
次に、アプリがどのリソースでどのロール (アクセス許可) を必要としているかを決定し、それらのロールをアプリに割り当てる必要があります。 ロールは、リソース、リソース グループ、またはサブスクリプション スコープで割り当てることができます。 ほとんどのアプリは、すべての Azure リソースを 1 つのリソース グループにグループ化するため、この例では、リソース グループ スコープでサービス プリンシパルのロールを割り当てる方法を示しています。
3 - アプリケーションの環境変数を構成する
DefaultAzureCredential
オブジェクトでは、実行時に一連の環境変数でサービス プリンシパルの資格情報が検索されます。 .NET を使用する場合、ツールと環境に応じて、複数の方法で環境変数を構成できます。
どの方法を選ぶかに関わらず、サービス プリンシパルを使う場合は、次の環境変数を構成します。
AZURE_CLIENT_ID
→ アプリ ID の値です。AZURE_TENANT_ID
→ テナント ID の値です。AZURE_CLIENT_SECRET
→アプリ用に生成されたパスワード/資格情報。
アプリが IIS でホストされている場合は、アプリ プールごとに環境変数を設定し、アプリ間で設定を分離することをお勧めします。
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_ID',value='00000000-0000-0000-0000-000000000000']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_TENANT_ID',value='11111111-1111-1111-1111-111111111111']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_SECRET',value='=abcdefghijklmnopqrstuvwxyz']" /commit:apphost
これらの設定は、applicationHost.config
ファイル内の applicationPools
要素を使って直接構成することもできます。
<applicationPools>
<add name="CorePool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic">
<environmentVariables>
<add name="ASPNETCORE_ENVIRONMENT" value="Development" />
<add name="AZURE_CLIENT_ID" value="00000000-0000-0000-0000-000000000000" />
<add name="AZURE_TENANT_ID" value="11111111-1111-1111-1111-111111111111" />
<add name="AZURE_CLIENT_SECRET" value="=abcdefghijklmnopqrstuvwxyz" />
</environmentVariables>
</add>
</applicationPools>
4 - アプリケーションに DefaultAzureCredential を実装する
DefaultAzureCredential は、Microsoft Entra に対して認証を行うための、厳格かつ順序付けされたメカニズムのシーケンスです。 それぞれの認証メカニズムは、TokenCredential クラスから派生したクラスであり、credential と呼ばれます。 実行時に、DefaultAzureCredential
は最初の資格情報を使用して認証を試みます。 その資格情報がアクセス トークンの取得に失敗した場合は、アクセス トークンが正常に取得されるまで、シーケンス内の次の資格情報が試行されます。 これにより、アプリは環境固有のコードを記述することなく、異なる環境で異なる資格情報を使用できます。
DefaultAzureCredential
によって資格情報が検索される順序と場所は、DefaultAzureCredential にあります。
DefaultAzureCredential
を使用するには、Azure.Identity と、必要に応じて Microsoft.Extensions.Azure パッケージをアプリケーションに追加します。
選択したターミナルで、アプリケーション プロジェクト ディレクトリに移動し、次のコマンドを実行します。
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
Azure サービスには、さまざまな Azure SDK クライアント ライブラリの特殊なクライアント クラスを使用してアクセスします。 これらのクラスと独自のカスタム サービスは、アプリ全体で依存関係の挿入を介してアクセスできるように登録する必要があります。 Program.cs
で、次の手順を実行してクライアント クラスと DefaultAzureCredential
を登録します。
using
ディレクティブを介してAzure.Identity
とMicrosoft.Extensions.Azure
名前空間を含めます。Add
というプレフィックスが付いた、対応する拡張メソッドを使用して、Azure サービス クライアントを登録します。UseCredential
メソッドにDefaultAzureCredential
のインスタンスを渡します。
次に例を示します。
using Microsoft.Extensions.Azure;
using Azure.Identity;
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new DefaultAzureCredential());
});
UseCredential
の代わりに、DefaultAzureCredential
を直接インスタンス化します。
using Azure.Identity;
builder.Services.AddSingleton<BlobServiceClient>(_ =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
上記のコードがローカル開発ワークステーションで実行されている場合、アプリケーション サービス プリンシパルの環境変数、または Visual Studio などのローカルにインストールされた開発者ツールで、開発者資格情報のセットが検索されます。 どちらの方法も、ローカル開発中に Azure リソースに対してアプリを認証するために使用できます。
Azure にデプロイすると、この同じコードで、アプリを他の Azure リソースに対して認証することもできます。 DefaultAzureCredential
では、環境設定とマネージド ID 構成を取得し、他のサービスに対して自動的に認証することができます。
.NET