次の方法で共有


オンプレミスでホストされている .NET アプリから Azure リソースに対して認証する

オンプレミスやサードパーティのデータ センターなど、Azureの外部でホストされているアプリでは、Microsoft Entra ID を介してアプリケーション サービス プリンシパルを使用してAzure サービスに対する認証を行う必要があります。 以下のセクションでは、次のことを説明します。

  • Microsoft Entra にアプリケーションを登録してサービス プリンシパルを作成する方法
  • スコープのアクセス許可にロールを割り当てる方法
  • アプリ コードからサービス プリンシパルを使用して認証する方法

専用のアプリケーション サービス プリンシパルを使用すると、Azure リソースにアクセスするときに最小限の特権の原則に従うことができます。 アクセス許可は開発中のアプリの特定の要件に限定されるため、他のアプリやサービスを対象としたAzure リソースに誤ってアクセスするのを防ぐことができます。 この方法は、開発環境でアプリが過剰に特権を持たないようにすることで、アプリが運用環境に移行されたときの問題を回避するのにも役立ちます。

アプリがホストされている環境ごとに異なるアプリ登録を作成する必要があります。 これにより、各サービス プリンシパルに対して環境固有のリソース アクセス許可が構成され、ある環境にデプロイされたアプリが、別の環境の一部である Azure リソースと通信しないようにすることができます。

Azure にアプリを登録する

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

  • Azureポータル
  • Azure CLI
  1. Azure ポータルで、検索バーを使用して App registrations ページに移動します。

  2. [アプリの登録] ページで、[+ 新規登録] を選択します。

  3. アプリケーションの登録ページ」で、次の手順を実行します。

    • [] フィールドに、アプリ名とターゲット環境を含むわかりやすい値を入力します。
    • [サポートされているアカウントの種類] で、この組織のディレクトリ内のアカウントのみ (Microsoft Customer Led only - Single tenant (Microsoft カスタマー主導の場合のみ - シングル テナント)) を選択するか、要件に最も適したオプションを選択します。
  4. [登録] を選択してアプリを登録し、サービス プリンシパルを作成します。

    Azure portal でアプリ登録を作成する方法を示すスクリーンショット。

  5. アプリの [アプリ登録] ページで、アプリケーション (クライアント) IDDirectory (テナント) ID コピーし、後でアプリ コード構成で使用できるように一時的な場所に貼り付けます。

  6. [証明書またはシークレットの追加] を選択して、アプリの資格情報を設定します。

  7. [証明書とシークレット] ページで、[+ 新しいクライアント シークレット] を選びます。

  8. 開いた [クライアント シークレットの追加] ポップアップ パネルで次の操作を実行します。

    • [説明] に、Current の値を入力します。
    • の [有効期限] の値は、既定値の 180 日間のままにします。
    • [追加] を選択してシークレットを追加します。
  9. 証明書 & シークレット ページで、クライアント シークレットの Value プロパティをコピーして、今後の手順で使用してください。

    クライアント シークレットの値は、アプリの登録が作成された後に 1 回だけ表示されます。 このクライアント シークレットを無効にすることなく、クライアント シークレットをさらに追加できますが、この値を再度表示する方法はありません。

アプリケーション サービス プリンシパルにロールを割り当てる

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

  • Azure ポータル
  • Azure CLI
  1. Azure ポータルで、アプリを含むリソース グループの Overview ページに移動します。

  2. 左側のナビゲーションから アクセス制御 (IAM) を選択します。

  3. [ アクセス制御 (IAM)] ページで、[ + 追加 ] を選択し、ドロップダウン メニューから [ ロールの割り当ての追加 ] を選択します。 [ ロールの割り当ての追加] ページには、ロールを構成して割り当てるためのタブがいくつか用意されています。

  4. [ ロール ] タブで、検索ボックスを使用して、割り当てるロールを見つけます。 ロールを選択し、[ 次へ] を選択します。

  5. [メンバー] タブで、次の 手順 を実行します。

    • [ 値へのアクセスの割り当て] で、[ ユーザー、グループ、またはサービス プリンシパル ] を選択します。
    • [メンバー] の値で 、[+ メンバーの選択] を選択して、[メンバーの選択] ポップアップ パネルを開きます。
    • 先ほど作成したサービス プリンシパルを検索し、フィルター処理された結果から選択します。 [ 選択 ] を選択してグループを選択し、ポップアップ パネルを閉じます。
    • [メンバー] タブの下部にある [確認と割り当て] を選択します。

    サービス プリンシパルにロールを割り当てる方法を示すスクリーンショット。

  6. [ 校閲と割り当て ] タブで、ページの下部にある [校閲と割り当て ] を選択します。

アプリ環境変数を設定する

実行時に、DefaultAzureCredentialEnvironmentCredential など、ClientSecretCredentialの特定の資格情報で、環境変数の規則によってサービス プリンシパル情報を検索します。 .NET を使用する場合、ツールと環境に応じて環境変数を構成する方法は複数あります。

選択した方法に関係なく、サービス プリンシパルに対して次の環境変数を構成します。

  • AZURE_CLIENT_ID: Azure に登録されているアプリを識別するために使用されます。
  • AZURE_TENANT_ID: Microsoft Entra テナントの ID。
  • AZURE_CLIENT_SECRET: アプリ用に生成されたシークレット資格情報。

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

"profiles": {
    "SampleProject": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7177;http://localhost:5177",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "<your-client-id>",
        "AZURE_TENANT_ID":"<your-tenant-id>",
        "AZURE_CLIENT_SECRET": "<your-client-secret>"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "<your-client-id>",
        "AZURE_TENANT_ID":"<your-tenant-id>",
        "AZURE_CLIENT_SECRET": "<your-client-secret>"
      }
    }
  }

アプリから Azure サービスに対して認証する

Azure Identity ライブラリには、さまざまな資格情報が用意されています。さまざまなシナリオと Microsoft Entra 認証フローのサポートに適応したTokenCredentialの実装です。 この手順では、ローカルおよび運用環境でサービス プリンシパルを操作するときに ClientSecretCredential を使用する方法を解説します。

コードを実装する

Azure.Identity パッケージを追加します。 ASP.NET Core プロジェクトで、Microsoft.Extensions.Azure パッケージもインストールします。

選択したターミナルで、アプリケーション プロジェクト ディレクトリに移動し、次のコマンドを実行します。

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

Azure サービスには、さまざまな Azure SDK クライアント ライブラリの特殊なクライアント クラスを使用してアクセスします。 これらのクラスと独自のカスタム サービスは、アプリ全体で使用できるように、依存関係の挿入に登録する必要があります。 Program.csで、次の手順を実行して、依存関係の挿入とトークンベースの認証用にクライアント クラスを構成します。

  1. using ディレクティブを用いて Azure.IdentityMicrosoft.Extensions.Azure 名前空間を含めます。
  2. Add というプレフィックスが付いた拡張メソッドを使用して、対応する Azure サービス クライアントを登録します。
  3. ClientSecretCredentialtenantId、および clientIdを使用して clientSecret を構成します。
  4. ClientSecretCredential インスタンスを UseCredential メソッドに渡します。
builder.Services.AddAzureClients(clientBuilder =>
{
    var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
    var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
    var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");

    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));

    clientBuilder.UseCredential(new ClientSecretCredential(tenantId, clientId, clientSecret));
});

UseCredential 方法の代わりに、サービス クライアントに資格情報を直接提供します。

var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");

builder.Services.AddSingleton<BlobServiceClient>(_ =>
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"),
        new ClientSecretCredential(tenantId, clientId, clientSecret)));