Microsoft.Identity.Web でクライアント シークレットを使用します。

クライアント シークレットは、Microsoft ID プラットフォームからトークンを要求するときにアプリケーションが ID を証明するために使用する文字列値です。 Microsoft。Identity.Web は、機密クライアント アプリケーションの資格情報の種類の 1 つとしてクライアント シークレットをサポートします。

Important

クライアント シークレットは、 開発環境とテスト環境でのみ使用する必要があります。 運用ワークロードの場合は、 証明書 または 証明書なしの資格情報 (マネージド ID やフェデレーション ID 資格情報など) を使用します。 クライアント シークレットは、証明書ベースの資格情報よりも侵害が容易であり、特定の操作にスコープを設定することはできません。

資格情報タイプの選択

機密クライアント アプリケーションには、Microsoft ID プラットフォームで認証するための資格情報が必要です。 Microsoft。Identity.Web では、ClientCredentials 構成セクションを通じて、次の資格情報の種類がサポートされます。

認証タイプ 推奨される環境 セキュリティ レベル
クライアント シークレット 開発、テスト
証書 ステージング、運用
マネージド ID Azureホスト型運用環境 最高
フェデレーション ID CI/CD、Kubernetes

クライアント シークレットは、Microsoft Entra IDでアプリに登録された単純な文字列です。 これらはセットアップするのが最も簡単な資格情報の種類ですが、セキュリティ上の重要な制限もあります。

  • ソース コード、ログ、または構成ファイルで誤って公開される可能性があります。
  • 有効期限があり、手動でローテーションする必要があります。
  • これらは、シークレットの所有を超えて呼び出し元の ID の暗号化証明を提供しません。

appsettings.json でクライアント シークレットを構成する

クライアント シークレットを構成するには、ClientCredentials ファイルの AzureAd セクションにappsettings.json配列を追加します。

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "YOUR_TENANT_ID",
    "ClientId": "YOUR_CLIENT_ID",
    "ClientCredentials": [
      {
        "SourceType": "ClientSecret",
        "ClientSecret": "YOUR_SECRET_VALUE"
      }
    ]
  }
}

ClientCredentials配列は、複数のエントリをサポートしています。 Microsoft。Identity.Web は、各資格情報が成功するまで順番に試行します。これは、シークレットローテーションのシナリオに役立ちます。

Warnung

実際のシークレット値をソース管理にコミットしないでください。 前の例の YOUR_SECRET_VALUE プレースホルダーは、次のセクションで説明するように、セキュリティで保護されたストアへの参照に置き換える必要があります。

開発用のシークレットを格納する

このセクションでは、ローカル開発時にシークレット値をソース コードから除外する方法について説明します。

.NET ユーザーシークレット

ローカル開発中にシークレットを格納するための推奨される方法は、 Secret Manager ツールです。 ユーザー シークレットは、プロジェクト ツリーの外部に機密データを格納するため、ソース管理への誤ったコミットを防ぎます。

  1. プロジェクトのユーザーシークレットを初期化せよ。

    dotnet user-secrets init
    
  2. クライアント シークレットの値を設定します。

    dotnet user-secrets set "AzureAd:ClientCredentials:0:ClientSecret" "your-secret-value"
    
  3. シークレットが格納されたことを確認します。

    dotnet user-secrets list
    

ユーザー シークレットは、DevelopmentまたはWebApplication.CreateBuilder()を使用すると、Host.CreateDefaultBuilder()環境に自動的に読み込まれます。

appsettings.jsonには、実際のシークレット値のない構造が含まれている必要があります。

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "YOUR_TENANT_ID",
    "ClientId": "YOUR_CLIENT_ID",
    "ClientCredentials": [
      {
        "SourceType": "ClientSecret"
      }
    ]
  }
}

環境変数

環境変数を使用して、クライアント シークレットを提供することもできます。 .NET構成では、__ (二重アンダースコア) 区切り記号を使用する環境変数が構成階層に自動的にマップされます。 シェルの変数を設定します。

$env:AzureAd__ClientCredentials__0__ClientSecret = "your-secret-value"

環境変数は appsettings.jsonの値よりも優先されるため、構成ファイル内のシークレット値は空または省略できます。

上位環境のシークレットを格納する

ステージング、QA、または任意の共有環境の場合は、Azure Key Vaultを構成ソースとして使用します。 この方法では、監査、アクセス ポリシー、自動ローテーション機能を提供しながら、構成ファイルと環境変数からシークレットを保持します。

構成ソースとしてAzure Key Vaultを追加する

  1. 必要な NuGet パッケージをインストールします。

    dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
    
  2. 構成パスにマップされる名前を使用して、クライアント シークレットをAzure Key Vaultに格納します。 区切り記号として -- (二重ダッシュ) を使用します。

    az keyvault secret set \
      --vault-name "your-keyvault-name" \
      --name "AzureAd--ClientCredentials--0--ClientSecret" \
      --value "your-secret-value"
    
  3. Key Vaultを構成ソースとして Program.cs に追加します。 次のコードは、標準構成 API を通じてシークレットを使用できるように、Key Vaultを登録します。

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Configuration.AddAzureKeyVault(
        new Uri("https://your-keyvault-name.vault.azure.net/"),
        new DefaultAzureCredential());
    

Key Vault シークレット名 AzureAd--ClientCredentials--0--ClientSecret は、AzureAd:ClientCredentials:0:ClientSecret 構成パスに自動的にマップされます。

ヒント

Key Vaultを使用してクライアント シークレットを格納する場合でも、運用環境のワークロードが証明書またはマネージド ID によってより適切に処理されるかどうかを検討してください。 Key Vaultは、共有開発環境またはステージング環境に役立ちますが、運用環境のアプリケーションでは、より強力な資格情報の種類を使用する必要があります。

Azure ポータルでクライアント シークレットを作成する

アプリケーションのクライアント シークレットを Microsoft Entra ID に登録するには、次の手順に従います。

  1. Microsoft Entra 管理センターにサインインします。
  2. Identity>Applications>アプリの登録 に移動します。
  3. 一覧からアプリケーションを選択します。
  4. 左側のメニューで、[ 証明書とシークレット] を選択します。
  5. [ クライアント シークレット ] タブを選択します。
  6. 新しいクライアント シークレットを選択します。
  7. [ クライアント シークレットの追加] ウィンドウで、次の操作を 行います。
    • シークレットの 説明 ("開発シークレット" など) を入力します。
    • [有効期限] 期間を選択します。 使用できるオプションには、180 日、365 日、730 日、またはカスタム日付があります。
    • [] を選択し、[] を追加します。
  8. シークレット値をすぐにコピーします。 値は 1 回だけ表示され、ページから移動した後は取得できません。

Important

作成直後にシークレット値を安全な場所に記録します。 Microsoft Entra IDは、作成時にのみ値を表示します。 値を失った場合は、新しいシークレットを作成する必要があります。

シークレットの有効期限とローテーションを管理する

クライアント シークレットの有効期間は最大であり、作成時に指定された日付に有効期限が切れます。 アプリケーションの停止を回避するためにシークレットローテーションを計画します。

有効期限の監視

  • アプリ登録の [証明書とシークレット] ページの [有効期限] 列を確認します。
  • 資格情報の有効期限が切れる前にアラートを受信するようにMicrosoft Entraの推奨事項を設定します。

ローテーション戦略

ダウンタイムなしのローテーションをサポートするには、 ClientCredentials 配列を使用します。

  1. Azure ポータルで新しいクライアント シークレットを作成します。

  2. ClientCredentials配列の追加エントリとして新しいシークレットを追加します。 新しいシークレットを最初に配置して、古いシークレットの前に試行されるようにします。

    {
      "AzureAd": {
        "ClientCredentials": [
          {
            "SourceType": "ClientSecret",
            "ClientSecret": "[NEW_SECRET_REFERENCE]"
          },
          {
            "SourceType": "ClientSecret",
            "ClientSecret": "[OLD_SECRET_REFERENCE]"
          }
        ]
      }
    }
    
  3. 更新された構成をデプロイします。 Microsoft。Identity.Web は最初の資格情報を試行し、最初の資格情報が失敗した場合は 2 番目の資格情報にフォールバックします。

  4. 新しいシークレットが動作することを確認したら、構成とAzure ポータルの両方から古いシークレットを削除します。

本番資格情報への移行

運用環境にデプロイする前に、クライアント シークレットからより安全な資格情報の種類に移行します。

証明書ベースの認証

証明書は、ID の暗号化証明を提供し、運用環境で推奨される資格情報の種類です。 次の構成では、Key Vaultから証明書を取得します。

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault-name.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name"
      }
    ]
  }
}

詳細な手順については、Microsoft.Identity.Web で証明書を使用するを参照してください。

マネージド ID (証明書なし)

Azureでホストされているアプリケーションの場合、マネージド ID では資格情報を完全に管理する必要がなくなります。 次の構成では、ユーザー割り当てマネージド ID が使用されます。

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity",
        "ManagedIdentityClientId": "YOUR_MANAGED_IDENTITY_CLIENT_ID"
      }
    ]
  }
}

詳細な手順については、Microsoft.Identity.Web を使用した 証明書レス認証 を参照してください。

移行チェックリスト

  • [ ] 新しい資格情報 (証明書またはマネージド ID) を生成またはプロビジョニングします。
  • [ ] 新しい資格情報の種類を使用するようにアプリケーション構成を更新します。
  • [ ] ステージング環境で新しい資格情報をテストします。
  • [ ] 運用環境にデプロイします。
  • [ ] Azure ポータルから古いクライアント シークレットを削除します。
  • [ ] 古いシークレットなしでアプリケーションが正しく機能するかどうかを確認します。

一般的なセキュリティミスを回避する

クライアント シークレットを使用する場合は、次のアンチパターンとその推奨される代替手段を確認します。

アンチパターン リスク レコメンデーション
ソースコードに秘密情報をハードコードする バージョン 管理で公開されるシークレット ユーザー シークレット、環境変数、またはKey Vaultを使用する
シークレットを含む appsettings.Development.json のコミット リポジトリ アクセス権を持つすべてのユーザーに公開されるシークレット ファイルを .gitignore に追加し、代わりにユーザー シークレットを使用する
環境間でシークレットを共有する 侵害された開発シークレットによって運用環境が公開される 環境ごとに一意のシークレットを使用する
運用環境でのシークレットの使用 資格情報の盗難のリスクが高い 証明書またはマネージド ID への移行
有効期限のないシークレットの作成 シークレットの有効期限が切れたときのアプリケーションの停止 有効期限のアラームを設定し、ローテーションを実装する
シークレット値のログ記録 ログ ファイルで公開されるシークレット 資格情報の値をログに記録しないでください。資格情報のソースの種類のみをログに記録する
サーバー上のプレーンテキスト ファイルにシークレットを格納する サーバー アクセス権を持つすべてのユーザーに公開されるシークレット 環境変数またはKey Vaultを使用する

一般的なエラーのトラブルシューティング

このセクションでは、クライアント シークレットを構成するときに発生する可能性がある頻繁なエラーについて説明します。

無効なクライアント シークレット

エラー: AADSTS7000215: Invalid client secret provided.

考えられる原因:

  • シークレット値が正しくコピーされませんでした。 シークレット値には、コピー/貼り付け操作中に切り捨てられる特殊文字を含めることができます。
  • シークレットは、 ClientIdで構成されたものとは異なるアプリ登録用に作成されました。
  • 構成パスが誤っており、シークレット値がアプリケーションによって読み取られていません。

解決方法:

  1. Azure ポータルで新しいクライアント シークレットを作成し、完全な値を慎重にコピーします。

  2. 構成内の ClientIdTenantId が、シークレットが作成されたアプリの登録と一致するかどうかを確認します。

  3. ブレークポイントまたはログ ステートメントを追加して、構成が正しく読み込まれたかどうかを確認します。

    // For debugging only — remove before committing
    var config = builder.Configuration.GetSection("AzureAd:ClientCredentials:0:ClientSecret").Value;
    Console.WriteLine($"Secret loaded: {!string.IsNullOrEmpty(config)}");
    

期限切れのクライアント シークレット

エラー: AADSTS7000222: The provided client secret keys for app '{app-id}' are expired.

解決方法:

  1. Microsoft Entra 管理センターでアプリの登録に移動します。
  2. [ 証明書とシークレット>Client シークレット] で有効期限を確認します。
  3. 新しいシークレットを作成し、アプリケーション構成を更新します。
  4. 期限切れのシークレットをポータルから削除します。

構成でシークレットが見つかりません

症状:シークレット値がNullReferenceExceptionのため、アプリケーションはnullを発生させるか、認証に失敗します。

考えられる原因:

  • ユーザー シークレットはプロジェクト用に初期化されません。
  • 環境変数の名前が、想定される構成パスと一致しません。
  • Key Vaultは構成ソースとして構成されていません。
  • アプリケーションは、ユーザー シークレットが読み込まれない開発環境以外で実行されています。

解決方法:

  1. ユーザー シークレットが初期化されていることを確認するには、UserSecretsId ファイル内の.csprojを確認します。
  2. dotnet user-secrets listを実行してシークレットが設定されていることを確認します。
  3. 構成パスが正確に一致することを確認します: AzureAd:ClientCredentials:0:ClientSecret
  4. 開発環境の外部で実行している場合は、適切な構成ソース (環境変数またはKey Vault) が使用可能であることを確認します。