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
![Azure portal の上部の検索バーを使用して、[アプリの登録] ページを検索してそこに移動する方法を示すスクリーンショット。](../media/on-premises-app-registration-azure-portal-1-240px.png)
![[アプリの登録] ページの [新規登録] ボタンの場所を示すスクリーンショット。](../media/on-premises-app-registration-azure-portal-2-240px.png)
![アプリに名前を付け、サポートされているアカウントの種類をこの組織ディレクトリ内のアカウントとしてのみ指定することで、[アプリケーションの登録] ページに入力する方法を示すスクリーンショット。](../media/on-premises-app-registration-azure-portal-3-240px.png)
![アプリの登録が完了した後の [アプリの登録] ページのスクリーンショット。このスクリーンショットは、今後の手順で必要になるアプリケーション ID とテナント ID の場所を示しています。また、アプリのアプリケーション シークレットを追加するために使用するリンクの場所も示しています。](../media/on-premises-app-registration-azure-portal-4-240px.png)





![[ロールの割り当て] タブへの移動方法と、ロールの割り当てをリソース グループに追加するボタンの場所を示すスクリーンショット。](../media/assign-service-principal-to-role-azure-portal-3-240px.png)



![完了した [ロールの割り当ての追加] ページと、プロセスを完了するために使用する [レビューと割り当て] ボタンの場所を示すスクリーンショット。](../media/assign-service-principal-to-role-azure-portal-7-240px.png)
