Azure SDK for .NET を使用して Azure でホストされたアプリを Azure リソースに対して認証する

Azure App Service、Azure Virtual Machines、Azure Container Instances などのサービスを使用してアプリが Azure でホストされている場合、Azure リソースに対してアプリを認証する方法として推奨されるのは、マネージド ID を使用することです。

マネージド ID では、シークレット キーやその他のアプリケーション シークレットを使用しなくても他の Azure リソースに接続できるように、アプリの ID を提供します。 内部的には、Azure でアプリの ID と、接続が許可されているリソースを把握します。 Azure では、この情報を使用してアプリの Microsoft Entra トークンを自動的に取得し、アプリケーション シークレットを管理しなくても、他の Azure リソースに接続できるようにします。

マネージド ID の種類

マネージド ID には、次の 2 種類があります。

  • システム割り当て - この種類のマネージド ID は、Azure リソースによって提供され、直接関連付けられます。 Azure リソースでマネージド ID を有効にすると、そのリソースのシステム割り当てマネージド ID が取得されます。 システム割り当てマネージド ID は、関連付けられている Azure リソースのライフサイクルに関連付けられます。 リソースが削除されると、その ID も Azure によって自動的に削除されます。 コードをホストしている Azure リソースのマネージド ID を有効にすればよいだけなので、これが最も使いやすい種類のマネージド ID です。
  • ユーザー割り当て - スタンドアロンの Azure リソースとしてマネージド ID を自分で作成することもできます。 これが最もよく使用されるのは、ソリューションに複数の Azure リソースで実行される複数のワークロードがあり、すべてが同じ ID と同じアクセス許可を共有する必要がある場合です。 たとえば、ソリューションに複数の App Service と仮想マシンのインスタンスで実行されるコンポーネントがあり、それらのすべてが同じ Azure リソース セットにアクセスする必要がある場合、それらのリソース全体でユーザー割り当てマネージド ID を作成して使用することは理にかなっています。

この記事では、アプリのシステム割り当てマネージド ID を有効にして使用する手順について説明します。 ユーザー割り当てマネージド ID を使用する必要がある場合は、「ユーザー割り当てマネージド ID の管理」の記事を参照して、ユーザー割り当てマネージド ID の作成方法を確認してください。

1 - アプリをホストしている Azure リソースでマネージド ID を有効にする

最初の手順では、アプリをホストしている Azure リソースでマネージド ID を有効にします。 たとえば、Azure App Service を使用して .NET アプリをホストしている場合は、そのアプリをホストしている App Service Web アプリのマネージド ID を有効にする必要があります。 仮想マシンを使用してアプリをホストしている場合は、VM でマネージド ID を使用できるようにします。

Azure portal または Azure CLI を使用して、マネージド ID を Azure リソースに使用できるようにすることができます。

手順 Screenshot
Azure portal 内で、アプリケーション コードをホストするリソースに移動します。たとえば、ページの上部にある検索ボックス内にそのリソース名を入力して、ダイアログ ボックス内で選択するとそこに移動できます。 Azure portal 内にある上部の検索バーを使用し、Azure リソースを見つけて移動する方法を示すスクリーンショット。
リソースのページ上で、左側のメニューから [ID] メニュー項目を選択します。マネージド ID をサポートできるすべての Azure リソースには、メニューのレイアウトが若干異なる場合はありますが、[ID] メニュー項目があります。 Azure リソースの左側のメニューにある [ID] メニュー項目の場所を示すスクリーンショット。
[ID] ページで、次の操作を行います。
  1. [状態] スライダーを [オン] に変更します。
  2. [保存] を選択します。
確認ダイアログでは、サービスのマネージド ID を有効にするかどうかを確認します。 [はい] と回答すると、Azure リソースに対してマネージド ID が有効になります。
リソースの [ID] ページで Azure リソースのマネージド ID を有効にする方法を示すスクリーンショット。

2 - マネージド ID にロールを割り当てる

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

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

ダイアログ ボックスの [リソース グループ] 見出しの下にあるリソース グループ名を選択して、リソース グループに移動します。
Azure portal の上部にある検索バーを使って Azure のリソース グループを検索して移動する方法を示すスクリーンショット。このリソース グループにロール (アクセス許可) を割り当てます。
リソース グループのページで、左側のメニューから [アクセス制御 (IAM)] を選択します。 Azure リソース グループの左側のメニューにある [アクセス制御 (IAM)] メニュー項目の場所を示すスクリーンショット。
[アクセス制御 (IAM)] ページで、次の操作を行います。
  1. [ロールの割り当て] タブを選択します。
  2. 上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
[ロールの割り当て] タブへの移動方法と、ロールの割り当てをリソース グループに追加するボタンの場所を示すスクリーンショット。
[ロールの割り当ての追加] ページには、リソース グループで割り当てることができるすべてのロールが一覧表示されます。
  1. 検索ボックスを使用して、より管理しやすいサイズにリストをフィルター処理します。 この例では、Storage BLOB ロールをフィルター処理する方法を示します。
  2. 割り当てるロールを選択します。
[次へ] を選択して、次の画面に進みます。
リソース グループに追加するロールの割り当てを見つけるためにフィルター処理して選択する方法を示すスクリーンショット。
次の [ロールの割り当ての追加] ページでは、ロールを割り当てるユーザーを指定できます。
  1. [アクセス権の割り当て先][マネージド ID] を選択します。
  2. [メンバー] の下にある [+ メンバーの選択] を選択します。
Azure portal の右側にダイアログ ボックスが開きます。
ロールの割り当ての追加ページで、ロール (アクセス許可) を割り当てるユーザーの種類としてマネージド ID を選ぶ方法を示すスクリーンショット。
[マネージド ID の選択] ダイアログで、次の操作を行います。
  1. [マネージド ID] ドロップダウンと [選択] テキスト ボックスを使用して、サブスクリプション内のマネージド ID の一覧をフィルター処理できます。 この例では、[App Service] を選択すると、App Service に関連付けられているマネージド ID のみが表示されます。
  2. アプリをホストしている Azure リソースのマネージド ID を選択します。
ダイアログの下部にある [選択] を選択して続行します。
マネージド ID の選択ダイアログを使って、ロールを割り当てるマネージド ID をフィルター処理し、選ぶ方法を示すスクリーンショット。
[ロールの割り当ての追加] 画面で、マネージド ID が選択済みとして表示されるようになりました。

[レビューと割り当て] を選択して最終ページに移動し、もう一度レビューと割り当てを行ってプロセスを完了します。
[ロールの割り当ての追加] の最終画面のスクリーンショット。ユーザーはここでロールの割り当てを確定するために [確認と割り当て] ボタンを選ぶ必要があります。

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

DefaultAzureCredential は、Microsoft Entra に対して認証を行うための、厳格な、順序付けされたシーケンスのメカニズムです。 それぞれの認証メカニズムは、TokenCredential クラスから派生したクラスであり、"資格情報" と呼ばれます。 実行時に、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 を登録します。

  1. using ディレクティブを介して Azure.IdentityMicrosoft.Extensions.Azure 名前空間を含めます。
  2. Add プレフィックスが付いた、対応する拡張メソッドを使用して、Azure サービス クライアントを登録します。
  3. 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 構成を取得し、他のサービスに対して自動的に認証することができます。