サービス プリンシパルを使って、ローカル開発中に Azure サービスに対して .NET アプリを認証する

クラウド アプリケーションを作成する場合、開発者はローカル ワークステーションでアプリケーションをデバッグおよびテストする必要があります。 ローカル開発時に開発者のワークステーションでアプリケーションを実行する場合でも、アプリで使用されるすべての Azure サービスに対して認証する必要があります。 この記事では、ローカル開発時に使用する専用のアプリケーション サービス プリンシパル オブジェクトを設定する方法について説明します。

A diagram showing how a .NET app during local development will use the developer's credentials to connect to Azure by obtaining those credentials locally installed development tools.

ローカル開発用の専用アプリケーション サービス プリンシパルを使用すると、アプリ開発時に最小限の特権の原則に従うことができます。 アクセス許可のスコープは開発時にアプリに必要なものだけに設定されるため、別のアプリで使用することを目的とした Azure リソースにアプリ コードが誤ってアクセスすることはありません。 また、これにより、開発環境でアプリに過剰な特権が与えられていたためにアプリが運用環境に移されたときに発生するバグも防ぐことができます。

アプリが Azure に登録されると、アプリケーション サービス プリンシパルがアプリ用に設定されます。 ローカル開発用にアプリを登録する場合は、次の手順を実行することをお勧めします。

  • アプリで作業する開発者ごとに個別のアプリ登録を作成します。 これにより、開発者ごとにローカル開発時に使用する個別のアプリケーション サービス プリンシパルが作成され、開発者が 1 つのアプリケーション サービス プリンシパルの資格情報を共有する必要がなくなります。
  • アプリごとに個別のアプリ登録を作成します。 これにより、アプリのアクセス許可のスコープがアプリに必要なものだけに設定されます。

ローカル開発時に、環境変数はアプリケーション サービス プリンシパルの ID で設定されます。 Azure SDK for .NET では、これらの環境変数を読み取り、この情報を使って、必要な Azure リソースに対してアプリが認証されます。

1 - Azure にアプリケーションを登録する

アプリケーション サービス プリンシパル オブジェクトは、Azure でアプリの登録を使用して作成されます。 これを行うには、Azure portal または Azure CLI のいずれかを使用します。

Azure portal にサインインして、次の手順を実行します。

手順 Screenshot
Azure portal で、次の操作を行います。
  1. Azure portal の上部にある検索バーに「アプリの登録」と入力します。
  2. 検索バーの下に表示されるメニューの [サービス] の下にある [アプリの登録] と書かれた項目を選択します。
A screenshot showing how to use the top search bar in the Azure portal to find and navigate to the App registrations page.
[アプリの登録] ページで、[+ 新規登録] を選択します。 A screenshot showing the location of the New registration button in the App registrations page.
[アプリケーションの登録] ページで、次のようにフォームに入力します。
  1. 名前 → Azure でのアプリ登録の名前を入力します。 この名前には、アプリ名、アプリ登録の対象となるユーザー、このアプリの登録がローカル開発で使用されることを示す識別子 ("dev" など) を含めるようにすることをお勧めします。
  2. サポートされているアカウントの種類この組織のディレクトリ内のアカウントのみ
[登録] を選択してアプリを登録し、アプリケーション サービス プリンシパルを作成します。
A screenshot showing how to fill out the Register an application page by giving the app a name and specifying supported account types as accounts in this organizational directory only.
お使いのアプリの [アプリの登録] ページで、次の操作を行います。
  1. アプリケーション (クライアント) ID → ローカル開発時にアプリが Azure にアクセスするために使用するアプリ ID です。 この値は、後の手順で必要になるので、テキスト エディターで一時的な場所にコピーします。
  2. ディレクトリ (テナント) ID → この値は、Azure に対して認証するときにもアプリで必要になります。 この値も後の手順で必要になるので、テキスト エディターで一時的な場所にコピーします。
  3. クライアント資格情報 → アプリが Azure に対して認証して Azure サービスを使用する前に、アプリのクライアント資格情報を設定する必要があります。 [証明書またはシークレットの追加] を選択して、アプリの資格情報を追加します。
A screenshot of the App registration page after the app registration has been completed. This screenshot shows the location of the application ID and tenant ID, which will be needed in a future step. It also shows the location of the link to use to add an application secret for the app.
[証明書とシークレット] ページで、[+ 新しいクライアント シークレット] を選びます。 A screenshot showing the location of the link to use to create a new client secret on the certificates and secrets page.
[クライアント シークレットの追加] ダイアログがページの右側から表示されます。 このダイアログで、次の操作を行います。
  1. 説明現在の値を入力します。
  2. 有効期限 → "24 か月"の値を選択します。
[追加] を選択してシークレットを追加します。
A screenshot showing the page where a new client secret is added for the application service principal create by the app registration process.
[証明書とシークレット] ページにクライアント シークレットの値が表示されます。

この値は、後の手順で必要になるので、テキスト エディターで一時的な場所にコピーします。

重要: この値が表示されるのは今回だけです。 このページを終了または更新すると、この値を再度表示できなくなります。 このクライアント シークレットを無効にすることなく、さらにクライアント シークレットを追加できますが、この値は再度表示されません。
A screenshot showing the page with the generated client secret.

2 - ローカル開発用の Azure AD セキュリティ グループを作成する

通常、1 つのアプリケーションで作業する開発者が複数いるため、個々のサービス プリンシパル オブジェクトにロールを割り当てるのではなく、Azure AD グループを作成して、ローカル開発でアプリに必要なロール (アクセス許可) をカプセル化することをお勧めします。 これには次のような利点があります。

  • ロールはグループ レベルで割り当てられるため、すべての開発者に同じロールが割り当てられることが保証されます。
  • アプリに新しいロールが必要な場合、追加する必要があるのはアプリの Azure AD グループのみです。
  • 新しい開発者がチームに参加する場合は、アプリで作業するための適切なアクセス許可が開発者に与えられるように、その開発者用に新しいアプリケーション サービス プリンシパルを作成してグループに追加します。
手順 Screenshot
ページの上部にある検索ボックスに「Azure Active Directory」と入力し、[サービス] の下から Azure Active Directory を選択して、Azure portal の [Azure Active Directory] ページに移動します。 A screenshot showing how to use the top search bar in the Azure portal to search for and navigate to the Azure Active Directory page.
[Azure Active Directory] ページで、左側のメニューから [グループ] を選択します。 A screenshot showing the location of the Groups menu item in the left-hand menu of the Azure Active Directory Default Directory page.
[すべてグループ] ページで、[新しいグループ] を選択します。 A screenshot showing the location of the New Group button in the All groups page.
[新しいグループ] ページで、次の操作を行います。
  1. グループの種類セキュリティ
  2. グループ名 →通常はアプリケーション名から作成される、セキュリティ グループの名前です。 また、グループの名前に "local-dev" のような文字列を含め、グループの目的も示すと便利です。
  3. グループの説明 → グループの目的の説明。
  4. [メンバー] の下の [メンバーが選択されていません] リンクを選択して、グループにメンバーを追加します。
A screenshot showing how to fill out the form to create a new Azure Active Directory group for the application. This screenshot also shows the location of the link to select to add members to this group.
[メンバーの追加] ダイアログ ボックスで、次の操作を行います。
  1. 検索ボックスを使用して、一覧で、プリンシパル名の一覧をフィルター処理します。
  2. このアプリのローカル開発用のアプリケーション サービス プリンシパルを選択します。 オブジェクトを選択すると、灰色表示され、ダイアログの下部にある [選択された項目] リストに移動します。
  3. 終わったら、[選択] ボタンを選択します。
A screenshot of the Add members dialog box showing how to select application service principals to be included in the group.
[新規グループ] ページに戻り、[作成] を選択して、グループを作成します。

グループが作成され、[すべてのグループ] ページに戻ります。 グループが表示されるまでに最大 30 秒かかる場合があり、Azure portal でのキャッシュのためにページの更新が必要になる場合があります。
A screenshot of the New Group page showing how to complete the process by selecting the Create button.

3 - アプリケーションにロールを割り当てる

次に、アプリで必要なリソースに対して必要なロール (アクセス許可) を決定し、それらのロールをアプリに割り当てる必要があります。 この例では、手順 2 で作成した Azure Active Directory グループにロールが割り当てられます。 ロールは、リソース、リソース グループ、またはサブスクリプション スコープで割り当てることができます。 ほとんどのアプリケーションではすべての Azure リソースを 1 つのリソース グループにグループ化するため、この例では、リソース グループのスコープでロールを割り当てる方法を示します。

手順 Screenshot
Azure portal の上部にある検索ボックスを使用してリソース グループ名を検索し、アプリケーションのリソース グループを見つけます。

ダイアログ ボックスの [リソース グループ] 見出しの下にあるリソース グループ名を選択して、リソース グループに移動します。
A screenshot showing how to use the top search box in the Azure portal to locate and navigate to the resource group you want to assign roles (permissions) to.
リソース グループのページで、左側のメニューから [アクセス制御 (IAM)] を選択します。 A screenshot of the resource group page showing the location of the Access control (IAM) menu item.
[アクセス制御 (IAM)] ページで、次の操作を行います。
  1. [ロールの割り当て] タブを選択します。
  2. 上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
A screenshot showing how to navigate to the role assignments tab and the location of the button used to add role assignments to a resource group.
[ロールの割り当ての追加] ページには、リソース グループで割り当てることができるすべてのロールが一覧表示されます。
  1. 検索ボックスを使用して、より管理しやすいサイズにリストをフィルター処理します。 この例では、Storage BLOB ロールをフィルター処理する方法を示します。
  2. 割り当てるロールを選択します。
[次へ] を選択して、次の画面に進みます。
A screenshot showing how to filter and select role assignments to be added to the resource group.
次の [ロールの割り当ての追加] ページでは、ロールを割り当てるユーザーを指定できます。
  1. [アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選択します。
  2. [メンバー][+ メンバーの選択] を選択する
Azure portal の右側にダイアログ ボックスが開きます。
A screenshot showing the radio button to select to assign a role to an Azure AD group and the link used to select the group to assign the role to.
[メンバーの選択] ダイアログで、次の操作を行います。
  1. [選択] テキスト ボックスを使用して、サブスクリプション内のユーザーとグループの一覧をフィルター処理できます。 必要に応じて、アプリ用に作成したローカル開発 Azure AD グループの最初の数文字を入力します。
  2. アプリケーションに関連付けられているローカル開発 Azure AD グループを選択します。
ダイアログの下部にある [選択] を選択して続行します。
A screenshot showing how to filter for and select the Azure AD group for the application in the Select members dialog box.
[ロールの割り当ての追加] 画面で、Azure AD グループが選択済みとして表示されるようになりました。

[レビューと割り当て] を選択して最終ページに移動し、もう一度レビューと割り当てを行ってプロセスを完了します。
A screenshot showing the completed Add role assignment page and the location of the Review + assign button used to complete the process.

4 - アプリケーションの環境変数を設定する

DefaultAzureCredential オブジェクトでは、実行時に一連の環境変数でサービス プリンシパル情報を検索します。 .NET を使う場合、ツールと環境に応じて、複数の方法で環境変数を構成できます。

どの方法を選ぶかに関わらず、サービス プリンシパルを使う場合は次の環境変数を構成する必要があります。

  • AZURE_CLIENT_ID → アプリ ID の値です。
  • AZURE_TENANT_ID → テナント ID の値です。
  • AZURE_CLIENT_SECRET →アプリ用に生成されたパスワード/資格情報。

Visual Studio でローカルに作業する場合、環境変数はプロジェクトの Properties フォルダーにある launchsettings.json ファイルで設定できます。 アプリを起動すると、これらの値は自動的に取り込まれます。 これらの構成はデプロイ時にアプリケーションと一緒に移動しないため、ターゲット ホスティング環境で環境変数を設定する必要があることに注意してください。

"profiles": {
    "SampleProject": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7177;http://localhost:5177",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID":"11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID": "11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    }
  }

5 - アプリケーションに DefaultAzureCredential を実装する

DefaultAzureCredential では複数の認証方法がサポートされており、実行時に使われる認証方法が決定されます。 このようにして、アプリでは環境固有のコードを実装することなく、さまざまな環境でさまざまな認証方法を使用できます。

DefaultAzureCredential によって資格情報が検索される順序と場所は、DefaultAzureCredential にあります。

DefaultAzureCredential を実装するには、最初に Azure.Identity と、必要に応じて Microsoft.Extensions.Azure パッケージをアプリケーションに追加します。 これを実行するには、コマンド ラインまたは NuGet パッケージ マネージャーを使います。

アプリケーション プロジェクト ディレクトリで任意のターミナル環境を開き、次のコマンドを入力します。

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

通常、Azure サービスには、SDK からの対応するクライアント クラスを使ってアクセスします。 これらのクラスと独自のカスタム サービスは、アプリ全体で依存関係の挿入を介してアクセスできるように、Program.cs ファイルに登録する必要があります。 Program.cs 内で、次の手順に従ってサービスと DefaultAzureCredential を正しくセットアップします。

  1. using ステートメントを使って、Azure.Identity 名前空間と Microsoft.Extensions.Azure 名前空間を組み込みます。
  2. 関連するヘルパー メソッドを使って Azure サービスを登録します。
  3. DefaultAzureCredential オブジェクトのインスタンスを UseCredential メソッドに渡します。

この例を次のコード セグメントに示します。

using Microsoft.Extensions.Azure;
using Azure.Identity;

// Inside of Program.cs
builder.Services.AddAzureClients(x =>
{
    x.AddBlobServiceClient(new Uri("https://<account-name>.blob.core.windows.net"));
    x.UseCredential(new DefaultAzureCredential());
});

または、次に示すように、追加の Azure 登録メソッドを使わず、サービスでより直接的に DefaultAzureCredential を利用することもできます。

using Azure.Identity;

// Inside of Program.cs
builder.Services.AddSingleton<BlobServiceClient>(x => 
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"),
        new DefaultAzureCredential()));

上記のコードがローカル開発中にローカル ワークステーションで実行されると、アプリケーション サービス プリンシパルの環境変数、または Visual Studio、VS Code、Azure CLI、または Azure PowerShell では一連の開発者資格情報が検索されます。いずれも、ローカル開発中に Azure リソースに対してアプリを認証するために使用できます。

Azure にデプロイすると、この同じコードでアプリを他の Azure リソースに対して認証することもできます。 DefaultAzureCredential では、環境設定とマネージド ID 構成を取得し、他のサービスに対して自動的に認証することができます。