サービス プリンシパルを使って、ローカル開発中に Azure サービスに対して .NET アプリを認証する
クラウド アプリケーションを作成する場合、開発者はローカル ワークステーションでアプリケーションをデバッグおよびテストする必要があります。 ローカル開発時に開発者のワークステーションでアプリケーションを実行する場合でも、アプリで使用されるすべての Azure サービスに対して認証する必要があります。 この記事では、ローカル開発時に使用する専用のアプリケーション サービス プリンシパル オブジェクトを設定する方法について説明します。
ローカル開発用の専用アプリケーション サービス プリンシパルを使用すると、アプリ開発時に最小限の特権の原則に従うことができます。 アクセス許可のスコープは開発時にアプリに必要なものだけに設定されるため、別のアプリで使用することを目的とした Azure リソースにアプリ コードが誤ってアクセスすることはありません。 また、これにより、開発環境でアプリに過剰な特権が与えられていたためにアプリが運用環境に移されたときに発生するバグも防ぐことができます。
アプリが Azure に登録されると、アプリケーション サービス プリンシパルがアプリ用に設定されます。 ローカル開発用にアプリを登録する場合は、次の手順を実行することをお勧めします。
- アプリで作業する開発者ごとに個別のアプリ登録を作成します。 これにより、開発者ごとにローカル開発時に使用する個別のアプリケーション サービス プリンシパルが作成され、開発者が 1 つのアプリケーション サービス プリンシパルの資格情報を共有する必要がなくなります。
- アプリごとに個別のアプリ登録を作成します。 これにより、アプリのアクセス許可のスコープがアプリに必要なものだけに設定されます。
ローカル開発時に、環境変数はアプリケーション サービス プリンシパルの ID で設定されます。 Azure SDK for .NET では、これらの環境変数を読み取り、この情報を使って、必要な Azure リソースに対してアプリが認証されます。
1 - Azure にアプリケーションを登録する
アプリケーション サービス プリンシパル オブジェクトは、Azure でアプリの登録を使用して作成されます。 これを行うには、Azure portal または Azure CLI のいずれかを使用します。
Azure portal にサインインして、次の手順を実行します。
2 - ローカル開発用の Azure AD セキュリティ グループを作成する
通常、1 つのアプリケーションで作業する開発者が複数いるため、個々のサービス プリンシパル オブジェクトにロールを割り当てるのではなく、Azure AD グループを作成して、ローカル開発でアプリに必要なロール (アクセス許可) をカプセル化することをお勧めします。 これには次のような利点があります。
- ロールはグループ レベルで割り当てられるため、すべての開発者に同じロールが割り当てられることが保証されます。
- アプリに新しいロールが必要な場合、追加する必要があるのはアプリの Azure AD グループのみです。
- 新しい開発者がチームに参加する場合は、アプリで作業するための適切なアクセス許可が開発者に与えられるように、その開発者用に新しいアプリケーション サービス プリンシパルを作成してグループに追加します。
3 - アプリケーションにロールを割り当てる
次に、アプリで必要なリソースに対して必要なロール (アクセス許可) を決定し、それらのロールをアプリに割り当てる必要があります。 この例では、手順 2 で作成した Azure Active Directory グループにロールが割り当てられます。 ロールは、リソース、リソース グループ、またはサブスクリプション スコープで割り当てることができます。 ほとんどのアプリケーションではすべての Azure リソースを 1 つのリソース グループにグループ化するため、この例では、リソース グループのスコープでロールを割り当てる方法を示します。
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
を正しくセットアップします。
- using ステートメントを使って、
Azure.Identity
名前空間とMicrosoft.Extensions.Azure
名前空間を組み込みます。 - 関連するヘルパー メソッドを使って Azure サービスを登録します。
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 構成を取得し、他のサービスに対して自動的に認証することができます。
.NET
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示