Penyedia konfigurasi Azure Key Vault di ASP.NET Core

Artikel ini menjelaskan cara menggunakan penyedia konfigurasi Azure Key Vault untuk memuat nilai konfigurasi aplikasi dari rahasia Azure Key Vault. Azure Key Vault adalah layanan berbasis cloud yang membantu melindungi kunci kriptografi dan rahasia yang digunakan oleh aplikasi dan layanan. Skenario umum untuk menggunakan Azure Key Vault dengan aplikasi ASP.NET Core meliputi:

  • Mengontrol akses ke data konfigurasi sensitif.
  • Memenuhi persyaratan untuk Modul Keamanan Perangkat Keras (HSM) tervalidasi FIPS 140-2 Level 2 saat menyimpan data konfigurasi.

Paket

Tambahkan referensi paket untuk paket berikut:

Aplikasi sampel

Aplikasi sampel berjalan di salah satu dari dua mode yang ditentukan oleh #define direktif praproscesor di bagian Program.csatas :

  • Certificate: Menunjukkan penggunaan ID Klien Azure Key Vault dan sertifikat X.509 untuk mengakses rahasia yang disimpan di Azure Key Vault. Sampel ini dapat dijalankan dari lokasi mana pun, baik yang disebarkan ke Azure App Service atau host apa pun yang dapat melayani aplikasi ASP.NET Core.
  • Managed: Menunjukkan cara menggunakan Identitas terkelola untuk sumber daya Azure. Identitas terkelola mengautentikasi aplikasi ke Azure Key Vault dengan autentikasi Azure Active Directory (AD) tanpa menyimpan kredensial dalam kode atau konfigurasi aplikasi. Versi Managed sampel harus disebarkan ke Azure. Ikuti panduan di bagian Menggunakan identitas terkelola untuk sumber daya Azure.

Untuk informasi selengkapnya mengonfigurasi aplikasi sampel menggunakan direktif prapemrosan (#define), lihat Gambaran Umum ASP.NET Core.

Melihat atau mengunduh kode sampel (cara mengunduh)

Penyimpanan rahasia di lingkungan Pengembangan

Atur rahasia secara lokal menggunakan Secret Manager. Saat aplikasi sampel berjalan pada komputer lokal di lingkungan Pengembangan, rahasia dimuat dari penyimpanan rahasia pengguna lokal.

Secret Manager memerlukan <UserSecretsId> properti dalam file proyek aplikasi. Atur nilai properti ({GUID}) ke GUID unik apa pun:

<PropertyGroup>
  <UserSecretsId>{GUID}</UserSecretsId>
</PropertyGroup>

Rahasia dibuat sebagai pasangan nama-nilai. Nilai hierarkis (bagian konfigurasi) menggunakan : (titik dua) sebagai pemisah dalam nama kunci konfigurasi ASP.NET Core.

Secret Manager digunakan dari shell perintah yang dibuka ke akar konten proyek, di mana {SECRET NAME} adalah nama dan {SECRET VALUE} merupakan nilainya:

dotnet user-secrets set "{SECRET NAME}" "{SECRET VALUE}"

Jalankan perintah berikut dalam shell perintah dari akar konten proyek untuk mengatur rahasia untuk aplikasi sampel:

dotnet user-secrets set "SecretName" "secret_value_1_dev"
dotnet user-secrets set "Section:SecretName" "secret_value_2_dev"

Ketika rahasia ini disimpan di Azure Key Vault di penyimpanan Rahasia di lingkungan Produksi dengan Azure Key Vault , akhiran _dev diubah menjadi _prod. Akhiran menyediakan isjin visual dalam output aplikasi yang menunjukkan sumber nilai konfigurasi.

Penyimpanan rahasia di lingkungan Produksi dengan Azure Key Vault

Selesaikan langkah-langkah berikut untuk membuat Azure Key Vault dan simpan rahasia aplikasi sampel di dalamnya. Untuk informasi selengkapnya, lihat Mulai Cepat: Mengatur dan mengambil rahasia dari Azure Key Vault menggunakan Azure CLI.

  1. Buka Azure Cloud Shell menggunakan salah satu metode berikut di portal Azure:

    • Pilih Coba di sudut kanan atas blok kode. Gunakan string pencarian "Azure CLI" di kotak teks.
    • Buka Cloud Shell di browser Anda dengan tombol Luncurkan Cloud Shell .
    • Pilih tombol Cloud Shell pada menu di sudut kanan atas portal Microsoft Azure.

    Untuk informasi selengkapnya, lihat Azure CLI dan Gambaran Umum Azure Cloud Shell.

  2. Jika Anda belum diautentikasi, masuk dengan az login perintah .

  3. Buat grup sumber daya dengan perintah berikut, di mana {RESOURCE GROUP NAME} adalah nama grup sumber daya baru dan {LOCATION} merupakan wilayah Azure:

    az group create --name "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  4. Buat Key Vault di grup sumber daya dengan perintah berikut, di mana {KEY VAULT NAME} adalah nama vault baru dan {LOCATION} merupakan wilayah Azure:

    az keyvault create --name {KEY VAULT NAME} --resource-group "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  5. Buat rahasia di vault sebagai pasangan nama-nilai.

    Nama rahasia Azure Key Vault terbatas pada karakter alfanumerik dan tanda hubung. Nilai hierarkis (bagian konfigurasi) menggunakan -- (dua tanda hubung) sebagai pemisah, karena titik dua tidak diizinkan dalam nama rahasia Key Vault. Titik dua memisahkan bagian dari subkuntah dalam konfigurasi ASP.NET Core. Urutan dua tanda hubung diganti dengan titik dua saat rahasia dimuat ke dalam konfigurasi aplikasi.

    Rahasia berikut adalah untuk digunakan dengan aplikasi sampel. Nilai termasuk _prod akhiran untuk membedakannya dari _dev nilai akhiran yang dimuat di lingkungan Pengembangan dari Secret Manager. Ganti {KEY VAULT NAME} dengan nama Key Vault yang Anda buat di langkah sebelumnya:

    az keyvault secret set --vault-name {KEY VAULT NAME} --name "SecretName" --value "secret_value_1_prod"
    az keyvault secret set --vault-name {KEY VAULT NAME} --name "Section--SecretName" --value "secret_value_2_prod"
    

Menggunakan ID Aplikasi dan sertifikat X.509 untuk aplikasi yang dihosting non-Azure

Konfigurasikan Azure AD, Azure Key Vault, dan aplikasi untuk menggunakan ID Aplikasi Azure AD dan sertifikat X.509 untuk mengautentikasi ke vault saat aplikasi dihosting di luar Azure. Untuk informasi selengkapnya, lihat Tentang kunci, rahasia, dan sertifikat.

Catatan

Meskipun menggunakan ID Aplikasi dan sertifikat X.509 didukung untuk aplikasi yang dihosting di Azure, tidak disarankan. Sebagai gantinya, gunakan Identitas terkelola untuk sumber daya Azure saat menghosting aplikasi di Azure. Identitas terkelola tidak memerlukan penyimpanan sertifikat di aplikasi atau di lingkungan pengembangan.

Aplikasi sampel menggunakan ID Aplikasi dan sertifikat X.509 saat #define direktif prapemrosea di bagian Program.cs atas diatur ke Certificate.

  1. Buat sertifikat arsip PKCS#12 (.pfx). Opsi untuk membuat sertifikat termasuk New-SelfSignedCertificate di Windows dan OpenSSL.
  2. Instal sertifikat ke penyimpanan sertifikat pribadi pengguna saat ini. Menandai kunci sebagai dapat diekspor bersifat opsional. Perhatikan thumbprint sertifikat, yang digunakan nanti dalam proses ini.
  3. Ekspor sertifikat arsip PKCS#12 (.pfx) sebagai sertifikat yang dikodekan DER (.cer).
  4. Daftarkan aplikasi dengan Azure AD (Pendaftaran aplikasi).
  5. Unggah sertifikat yang dikodekan DER (.cer) ke Microsoft Azure AD:
    1. Pilih aplikasi di Azure ACTIVE Directory.
    2. Navigasikan ke Sertifikat & rahasia.
    3. Pilih Unggah sertifikat untuk mengunggah sertifikat, yang berisi kunci publik. Sertifikat .cer, .pem, atau .crt dapat diterima.
  6. Simpan nama Key Vault, ID Aplikasi, dan thumbprint sertifikat dalam file aplikasi appsettings.json .
  7. Navigasikan ke Key Vault di portal Azure.
  8. Pilih Key Vault yang Anda buat di penyimpanan Rahasia di bagian Lingkungan produksi dengan Azure Key Vault .
  9. Pilih Kebijakan akses.
  10. Pilih Tambahkan Kebijakan Akses.
  11. Buka izin Rahasia dan berikan izin Dapatkan dan Daftar aplikasi.
  12. Pilih Pilih prinsipal dan pilih aplikasi terdaftar berdasarkan nama. Pilih tombol Pilih.
  13. Pilih OK.
  14. Pilih Simpan.
  15. Sebarkan aplikasi.

Aplikasi Certificate sampel mendapatkan nilai konfigurasinya dari IConfigurationRoot dengan nama yang sama dengan nama rahasia:

  • Nilai non-hierarkis: Nilai untuk SecretName diperoleh dengan config["SecretName"].
  • Nilai hierarkis (bagian): Gunakan : notasi (titik dua) atau GetSection metode . Gunakan salah satu pendekatan ini untuk mendapatkan nilai konfigurasi:
    • config["Section:SecretName"]
    • config.GetSection("Section")["SecretName"]

Sertifikat X.509 dikelola oleh OS. Aplikasi memanggil dengan nilai yang AddAzureKeyVault disediakan oleh appsettings.json file:


using System.Security.Cryptography.X509Certificates;
using Azure.Identity;

var builder = WebApplication.CreateBuilder(args);

if (builder.Environment.IsProduction())
{
    using var x509Store = new X509Store(StoreLocation.CurrentUser);

    x509Store.Open(OpenFlags.ReadOnly);

    var x509Certificate = x509Store.Certificates
        .Find(
            X509FindType.FindByThumbprint,
            builder.Configuration["AzureADCertThumbprint"],
            validOnly: false)
        .OfType<X509Certificate2>()
        .Single();

    builder.Configuration.AddAzureKeyVault(
        new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
        new ClientCertificateCredential(
            builder.Configuration["AzureADDirectoryId"],
            builder.Configuration["AzureADApplicationId"],
            x509Certificate));
}

var app = builder.Build();

Nilai contoh:

  • Nama Key Vault: contosovault
  • ID Aplikasi: 627e911e-43cc-61d4-992e-12db9c81b413
  • Thumbprint sertifikat: fe14593dd66b2406c5269d742d04b6e1ab03adb1

appsettings.json:

{
  "KeyVaultName": "Key Vault Name",
  "AzureADApplicationId": "Azure AD Application ID",
  "AzureADCertThumbprint": "Azure AD Certificate Thumbprint",
  "AzureADDirectoryId": "Azure AD Directory ID"
}

Saat Anda menjalankan aplikasi, halaman web menampilkan nilai rahasia yang dimuat. Di lingkungan Pengembangan, nilai rahasia dimuat dengan akhiran _dev . Di lingkungan Produksi, nilai dimuat dengan akhiran _prod .

Menggunakan identitas terkelola untuk sumber daya Azure

Aplikasi yang disebarkan ke Azure dapat memanfaatkan Identitas terkelola untuk sumber daya Azure. Identitas terkelola memungkinkan aplikasi untuk mengautentikasi dengan Azure Key Vault menggunakan autentikasi Azure AD tanpa menyimpan kredensial dalam kode atau konfigurasi aplikasi.

Aplikasi sampel menggunakan identitas terkelola yang ditetapkan sistem saat #define direktif prapemroseduran di bagian Program.cs atas diatur ke Managed. Untuk membuat identitas terkelola untuk aplikasi Azure App Service, lihat Cara menggunakan identitas terkelola untuk App Service dan Azure Functions. Setelah identitas terkelola dibuat, perhatikan ID Objek aplikasi yang ditampilkan di portal Azure pada Identity panel App Service.

Masukkan nama vault ke dalam file aplikasi appsettings.json . Aplikasi sampel tidak memerlukan ID Aplikasi dan Kata Sandi (Rahasia Klien) saat diatur ke versi, sehingga Anda dapat mengabaikan entri konfigurasi tersebut Managed . Aplikasi ini disebarkan ke Azure, dan Azure mengautentikasi aplikasi untuk mengakses Azure Key Vault hanya menggunakan nama vault yang disimpan dalam appsettings.json file.

Sebarkan aplikasi sampel ke Azure App Service.

Menggunakan Azure CLI dan ID Objek aplikasi, berikan aplikasi dengan list izin dan get untuk mengakses vault:

az keyvault set-policy --name {KEY VAULT NAME} --object-id {OBJECT ID} --secret-permissions get list

Mulai ulang aplikasi menggunakan Azure CLI, PowerShell, atau portal Azure.

Aplikasi sampel membuat instans DefaultAzureCredential kelas. Kredensial mencoba mendapatkan token akses dari lingkungan untuk sumber daya Azure:

using Azure.Identity;

var builder = WebApplication.CreateBuilder(args);

if (builder.Environment.IsProduction())
{
    builder.Configuration.AddAzureKeyVault(
        new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
        new DefaultAzureCredential());
}

Nilai contoh nama Key Vault: contosovault

appsettings.json:

{
  "KeyVaultName": "Key Vault Name"
}

Untuk aplikasi yang menggunakan identitas terkelola yang ditetapkan pengguna, konfigurasikan ID Klien identitas terkelola menggunakan salah satu pendekatan berikut:

  1. Atur AZURE_CLIENT_ID variabel lingkungan.

  2. Atur DefaultAzureCredentialOptions.ManagedIdentityClientId properti saat memanggil AddAzureKeyVault:

    builder.Configuration.AddAzureKeyVault(
        new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
        new DefaultAzureCredential(new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = builder.Configuration["AzureADManagedIdentityClientId"]
        }));
    

Saat Anda menjalankan aplikasi, halaman web menampilkan nilai rahasia yang dimuat. Di lingkungan Pengembangan, nilai rahasia memiliki akhiran _dev karena disediakan oleh Secret Manager. Di lingkungan Produksi, nilai dimuat dengan akhiran _prod karena disediakan oleh Azure Key Vault.

Jika Anda menerima kesalahan Access denied , konfirmasikan bahwa aplikasi terdaftar di Microsoft Azure ACTIVE Directory dan menyediakan akses ke vault. Konfirmasikan bahwa Anda telah memulai ulang layanan di Azure.

Untuk informasi tentang menggunakan penyedia dengan identitas terkelola dan Azure Pipelines, lihat Membuat koneksi layanan Azure Resource Manager ke VM dengan identitas layanan terkelola.

Opsi konfigurasi

AddAzureKeyVault dapat menerima AzureKeyVaultConfigurationOptions objek:

// using Azure.Extensions.AspNetCore.Configuration.Secrets;

builder.Configuration.AddAzureKeyVault(
    new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
    new DefaultAzureCredential(),
    new AzureKeyVaultConfigurationOptions
    {
        // ...
    });

Objek AzureKeyVaultConfigurationOptions berisi properti berikut:

Properti Deskripsi
Manager KeyVaultSecretManager instans yang digunakan untuk mengontrol pemuatan rahasia.
ReloadInterval TimeSpan untuk menunggu di antara upaya polling vault untuk perubahan. Nilai defaultnya adalah null (konfigurasi tidak dimuat ulang).

Menggunakan awalan nama kunci

AddAzureKeyVault menyediakan kelebihan beban yang menerima implementasi KeyVaultSecretManager, yang memungkinkan Anda mengontrol bagaimana rahasia Key Vault dikonversi menjadi kunci konfigurasi. Misalnya, Anda dapat mengimplementasikan antarmuka untuk memuat nilai rahasia berdasarkan nilai awalan yang Anda berikan saat memulai aplikasi. Teknik ini memungkinkan Anda, misalnya, memuat rahasia berdasarkan versi aplikasi.

Peringatan

Jangan gunakan awalan pada rahasia Key Vault untuk:

  • Tempatkan rahasia untuk beberapa aplikasi ke dalam vault yang sama.
  • Tempatkan rahasia lingkungan (misalnya, pengembangan versus rahasia produksi ) ke dalam vault yang sama.

Aplikasi dan lingkungan pengembangan/produksi yang berbeda harus menggunakan Key Vault terpisah untuk mengisolasi lingkungan aplikasi untuk tingkat keamanan tertinggi.

Dalam contoh berikut, rahasia dibuat di Key Vault (dan menggunakan Secret Manager untuk lingkungan Pengembangan) untuk 5000-AppSecret (periode tidak diizinkan dalam nama rahasia Key Vault). Rahasia ini mewakili rahasia aplikasi untuk aplikasi versi 5.0.0.0. Untuk versi aplikasi lain, 5.1.0.0, rahasia ditambahkan ke vault (dan menggunakan Secret Manager) untuk 5100-AppSecret. Setiap versi aplikasi memuat nilai rahasia versinya ke dalam konfigurasinya sebagai AppSecret, menghapus versi saat memuat rahasia.

AddAzureKeyVault dipanggil dengan implementasi kustom KeyVaultSecretManager :

// using Azure.Extensions.AspNetCore.Configuration.Secrets;

builder.Configuration.AddAzureKeyVault(
    new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
    new DefaultAzureCredential(),
    new SamplePrefixKeyVaultSecretManager("5000"));

Implementasi bereaksi terhadap awalan versi rahasia untuk memuat rahasia yang tepat ke dalam konfigurasi:

  • Load memuat rahasia ketika namanya dimulai dengan awalan. Rahasia lain tidak dimuat.
  • GetKey:
    • Menghapus awalan dari nama rahasia.
    • Mengganti dua tanda hubung dalam nama apa pun dengan KeyDelimiter, yang merupakan pemisah yang digunakan dalam konfigurasi (biasanya titik dua). Azure Key Vault tidak mengizinkan titik dua dalam nama rahasia.
public class SamplePrefixKeyVaultSecretManager : KeyVaultSecretManager
{
    private readonly string _prefix;

    public SamplePrefixKeyVaultSecretManager(string prefix)
        => _prefix = $"{prefix}-";

    public override bool Load(SecretProperties properties)
        => properties.Name.StartsWith(_prefix);

    public override string GetKey(KeyVaultSecret secret)
        => secret.Name[_prefix.Length..].Replace("--", ConfigurationPath.KeyDelimiter);
}

Metode Load ini dipanggil oleh algoritma penyedia yang melakukan iterasi melalui rahasia vault untuk menemukan rahasia awalan versi. Ketika awalan versi ditemukan dengan Load, algoritma menggunakan GetKey metode untuk mengembalikan nama konfigurasi nama rahasia. Ini menghapus awalan versi dari nama rahasia. Nama rahasia lainnya dikembalikan untuk dimuat ke dalam pasangan nama-nilai konfigurasi aplikasi.

Ketika pendekatan ini diimplementasikan:

  1. Versi aplikasi yang ditentukan dalam file proyek aplikasi. Dalam contoh berikut, versi aplikasi diatur ke 5.0.0.0:

    <PropertyGroup>
      <Version>5.0.0.0</Version>
    </PropertyGroup>
    
  2. Konfirmasikan bahwa <UserSecretsId> properti ada dalam file proyek aplikasi, di mana {GUID} adalah GUID yang disediakan pengguna:

    <PropertyGroup>
      <UserSecretsId>{GUID}</UserSecretsId>
    </PropertyGroup>
    

    Simpan rahasia berikut secara lokal dengan Secret Manager:

    dotnet user-secrets set "5000-AppSecret" "5.0.0.0_secret_value_dev"
    dotnet user-secrets set "5100-AppSecret" "5.1.0.0_secret_value_dev"
    
  3. Rahasia disimpan di Azure Key Vault menggunakan perintah Azure CLI berikut:

    az keyvault secret set --vault-name {KEY VAULT NAME} --name "5000-AppSecret" --value "5.0.0.0_secret_value_prod"
    az keyvault secret set --vault-name {KEY VAULT NAME} --name "5100-AppSecret" --value "5.1.0.0_secret_value_prod"
    
  4. Saat aplikasi dijalankan, rahasia Key Vault dimuat. Rahasia string untuk 5000-AppSecret dicocokkan dengan versi aplikasi yang ditentukan dalam file proyek aplikasi (5.0.0.0).

  5. Versi , 5000 (dengan tanda hubung), dilucuti dari nama kunci. Di seluruh aplikasi, membaca konfigurasi dengan kunci AppSecret memuat nilai rahasia.

  6. Jika versi aplikasi diubah dalam file proyek ke 5.1.0.0 dan aplikasi dijalankan lagi, nilai rahasia yang dikembalikan berada 5.1.0.0_secret_value_dev di lingkungan Pengembangan dan 5.1.0.0_secret_value_prod di Produksi.

Catatan

Anda juga dapat memberikan implementasi Anda sendiri SecretClient ke AddAzureKeyVault. Klien kustom mengizinkan berbagi satu instans klien di seluruh aplikasi.

Mengikat array ke kelas

Penyedia dapat membaca nilai konfigurasi ke dalam array untuk mengikat ke array POCO.

Saat membaca dari sumber konfigurasi yang memungkinkan kunci berisi pemisah titik dua (:), segmen kunci numerik digunakan untuk membedakan kunci yang membentuk array (:0:, , :1:... :{n}:). Untuk informasi selengkapnya, lihat Konfigurasi: Mengikat array ke kelas.

Kunci Azure Key Vault tidak dapat menggunakan titik dua sebagai pemisah. Pendekatan yang dijelaskan dalam artikel ini menggunakan tanda hubung ganda (--) sebagai pemisah untuk nilai hierarkis (bagian). Kunci array disimpan di Azure Key Vault dengan tanda hubung ganda dan segmen kunci numerik (--0--, --1--, ... --{n}--).

Periksa konfigurasi penyedia pengelogan Serilog berikut yang JSdisediakan oleh file ON. Ada dua literal objek yang ditentukan dalam WriteTo array yang mencerminkan dua sink Serilog, yang menjelaskan tujuan untuk output pengelogan:

"Serilog": {
  "WriteTo": [
    {
      "Name": "AzureTableStorage",
      "Args": {
        "storageTableName": "logs",
        "connectionString": "DefaultEnd...ountKey=Eby8...GMGw=="
      }
    },
    {
      "Name": "AzureDocumentDB",
      "Args": {
        "endpointUrl": "https://contoso.documents.azure.com:443",
        "authorizationKey": "Eby8...GMGw=="
      }
    }
  ]
}

Konfigurasi yang ditampilkan dalam file ON sebelumnya JSdisimpan di Azure Key Vault menggunakan notasi tanda hubung ganda (--) dan segmen numerik:

Tombol Nilai
Serilog--WriteTo--0--Name AzureTableStorage
Serilog--WriteTo--0--Args--storageTableName logs
Serilog--WriteTo--0--Args--connectionString DefaultEnd...ountKey=Eby8...GMGw==
Serilog--WriteTo--1--Name AzureDocumentDB
Serilog--WriteTo--1--Args--endpointUrl https://contoso.documents.azure.com:443
Serilog--WriteTo--1--Args--authorizationKey Eby8...GMGw==

Memuat ulang rahasia

Secara default, rahasia di-cache oleh penyedia konfigurasi untuk masa pakai aplikasi. Rahasia yang kemudian telah dinonaktifkan atau diperbarui di vault diabaikan oleh aplikasi.

Untuk memuat ulang rahasia, panggil IConfigurationRoot.Reload:

config.Reload();

Untuk memuat ulang rahasia secara berkala, pada interval yang ditentukan, atur AzureKeyVaultConfigurationOptions.ReloadInterval properti . Untuk informasi selengkapnya, lihat Opsi konfigurasi.

Rahasia yang dinonaktifkan dan kedaluwarsa

Rahasia yang kedaluwarsa disertakan secara default di penyedia konfigurasi. Untuk mengecualikan nilai untuk rahasia ini dalam konfigurasi aplikasi, perbarui rahasia yang kedaluwarsa atau berikan konfigurasi menggunakan penyedia konfigurasi kustom:

class SampleKeyVaultSecretManager : KeyVaultSecretManager
{
  public override bool Load(SecretProperties properties) =>
    properties.ExpiresOn.HasValue &&
    properties.ExpiresOn.Value > DateTimeOffset.Now;
}

Teruskan kustom KeyVaultSecretManager ini ke AddAzureKeyVault:

// using Azure.Extensions.AspNetCore.Configuration.Secrets;

builder.Configuration.AddAzureKeyVault(
    new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
    new DefaultAzureCredential(),
    new SampleKeyVaultSecretManager());

Rahasia yang dinonaktifkan tidak dapat diambil dari Key Vault dan tidak pernah disertakan.

Pemecahan masalah

Saat aplikasi gagal memuat konfigurasi menggunakan penyedia, pesan kesalahan ditulis ke infrastruktur ASP.NET Core Logging. Kondisi berikut akan mencegah konfigurasi dimuat:

  • Aplikasi atau sertifikat tidak dikonfigurasi dengan benar di Azure AD.
  • Vault tidak ada di Azure Key Vault.
  • Aplikasi ini tidak berwenang untuk mengakses vault.
  • Kebijakan akses tidak termasuk Get dan List izin.
  • Di vault, data konfigurasi (pasangan nama-nilai) salah bernama, hilang, atau dinonaktifkan.
  • Aplikasi ini memiliki nama Key Vault (KeyVaultName), ID Aplikasi Azure AD (AzureADApplicationId), atau thumbprint sertifikat Azure AD (AzureADCertThumbprint), atau ID Direktori Azure AD (AzureADDirectoryId).
  • Saat menambahkan kebijakan akses Key Vault untuk aplikasi, kebijakan dibuat, tetapi tombol Simpan tidak dipilih di antarmuka pengguna Kebijakan akses.

Sumber daya tambahan

Artikel ini menjelaskan cara menggunakan penyedia konfigurasi Azure Key Vault untuk memuat nilai konfigurasi aplikasi dari rahasia Azure Key Vault. Azure Key Vault adalah layanan berbasis cloud yang membantu melindungi kunci kriptografi dan rahasia yang digunakan oleh aplikasi dan layanan. Skenario umum untuk menggunakan Azure Key Vault dengan aplikasi ASP.NET Core meliputi:

  • Mengontrol akses ke data konfigurasi sensitif.
  • Memenuhi persyaratan untuk Modul Keamanan Perangkat Keras (HSM) tervalidasi FIPS 140-2 Level 2 saat menyimpan data konfigurasi.

Paket

Tambahkan referensi paket untuk paket berikut:

Aplikasi sampel

Aplikasi sampel berjalan di salah satu dari dua mode yang ditentukan oleh #define direktif praproscesor di bagian Program.csatas :

  • Certificate: Menunjukkan penggunaan ID Klien Azure Key Vault dan sertifikat X.509 untuk mengakses rahasia yang disimpan di Azure Key Vault. Sampel ini dapat dijalankan dari lokasi mana pun, baik yang disebarkan ke Azure App Service atau host apa pun yang dapat melayani aplikasi ASP.NET Core.
  • Managed: Menunjukkan cara menggunakan Identitas terkelola untuk sumber daya Azure. Identitas terkelola mengautentikasi aplikasi ke Azure Key Vault dengan autentikasi Azure Active Directory (AD) tanpa kredensial yang disimpan dalam kode atau konfigurasi aplikasi. Saat menggunakan identitas terkelola untuk mengautentikasi, ID Aplikasi Azure AD dan Kata Sandi (Rahasia Klien) tidak diperlukan. Versi Managed sampel harus disebarkan ke Azure. Ikuti panduan di bagian Menggunakan identitas terkelola untuk sumber daya Azure.

Untuk informasi selengkapnya mengonfigurasi aplikasi sampel menggunakan direktif prapemrosan (#define), lihat Gambaran Umum ASP.NET Core.

Melihat atau mengunduh kode sampel (cara mengunduh)

Penyimpanan rahasia di lingkungan Pengembangan

Atur rahasia secara lokal menggunakan Secret Manager. Saat aplikasi sampel berjalan pada komputer lokal di lingkungan Pengembangan, rahasia dimuat dari penyimpanan rahasia pengguna lokal.

Secret Manager memerlukan <UserSecretsId> properti dalam file proyek aplikasi. Atur nilai properti ({GUID}) ke GUID unik apa pun:

<PropertyGroup>
  <UserSecretsId>{GUID}</UserSecretsId>
</PropertyGroup>

Rahasia dibuat sebagai pasangan nama-nilai. Nilai hierarkis (bagian konfigurasi) menggunakan : (titik dua) sebagai pemisah dalam nama kunci konfigurasi ASP.NET Core.

Secret Manager digunakan dari shell perintah yang dibuka ke akar konten proyek, di mana {SECRET NAME} adalah nama dan {SECRET VALUE} merupakan nilainya:

dotnet user-secrets set "{SECRET NAME}" "{SECRET VALUE}"

Jalankan perintah berikut dalam shell perintah dari akar konten proyek untuk mengatur rahasia untuk aplikasi sampel:

dotnet user-secrets set "SecretName" "secret_value_1_dev"
dotnet user-secrets set "Section:SecretName" "secret_value_2_dev"

Ketika rahasia ini disimpan di Azure Key Vault di penyimpanan Rahasia di lingkungan Produksi dengan Azure Key Vault , akhiran _dev diubah menjadi _prod. Akhiran menyediakan isjin visual dalam output aplikasi yang menunjukkan sumber nilai konfigurasi.

Penyimpanan rahasia di lingkungan Produksi dengan Azure Key Vault

Selesaikan langkah-langkah berikut untuk membuat Azure Key Vault dan simpan rahasia aplikasi sampel di dalamnya. Untuk informasi selengkapnya, lihat Mulai Cepat: Mengatur dan mengambil rahasia dari Azure Key Vault menggunakan Azure CLI.

  1. Buka Azure Cloud Shell menggunakan salah satu metode berikut di portal Azure:

    • Pilih Coba di sudut kanan atas blok kode. Gunakan string pencarian "Azure CLI" di kotak teks.
    • Buka Cloud Shell di browser Anda dengan tombol Luncurkan Cloud Shell .
    • Pilih tombol Cloud Shell pada menu di sudut kanan atas portal Microsoft Azure.

    Untuk informasi selengkapnya, lihat Azure CLI dan Gambaran Umum Azure Cloud Shell.

  2. Jika Anda belum diautentikasi, masuk dengan az login perintah .

  3. Buat grup sumber daya dengan perintah berikut, di mana {RESOURCE GROUP NAME} adalah nama grup sumber daya baru dan {LOCATION} merupakan wilayah Azure:

    az group create --name "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  4. Buat Key Vault di grup sumber daya dengan perintah berikut, di mana {KEY VAULT NAME} adalah nama vault baru dan {LOCATION} merupakan wilayah Azure:

    az keyvault create --name {KEY VAULT NAME} --resource-group "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  5. Buat rahasia di vault sebagai pasangan nama-nilai.

    Nama rahasia Azure Key Vault terbatas pada karakter alfanumerik dan tanda hubung. Nilai hierarkis (bagian konfigurasi) menggunakan -- (dua tanda hubung) sebagai pemisah, karena titik dua tidak diizinkan dalam nama rahasia Key Vault. Titik dua memisahkan bagian dari subkuntah dalam konfigurasi ASP.NET Core. Urutan dua tanda hubung diganti dengan titik dua saat rahasia dimuat ke dalam konfigurasi aplikasi.

    Rahasia berikut adalah untuk digunakan dengan aplikasi sampel. Nilai termasuk _prod akhiran untuk membedakannya dari _dev nilai akhiran yang dimuat di lingkungan Pengembangan dari Secret Manager. Ganti {KEY VAULT NAME} dengan nama Key Vault yang Anda buat di langkah sebelumnya:

    az keyvault secret set --vault-name {KEY VAULT NAME} --name "SecretName" --value "secret_value_1_prod"
    az keyvault secret set --vault-name {KEY VAULT NAME} --name "Section--SecretName" --value "secret_value_2_prod"
    

Menggunakan ID Aplikasi dan sertifikat X.509 untuk aplikasi yang dihosting non-Azure

Konfigurasikan Azure AD, Azure Key Vault, dan aplikasi untuk menggunakan ID Aplikasi Azure AD dan sertifikat X.509 untuk mengautentikasi ke vault saat aplikasi dihosting di luar Azure. Untuk informasi selengkapnya, lihat Tentang kunci, rahasia, dan sertifikat.

Catatan

Meskipun menggunakan ID Aplikasi dan sertifikat X.509 didukung untuk aplikasi yang dihosting di Azure, tidak disarankan. Sebagai gantinya, gunakan Identitas terkelola untuk sumber daya Azure saat menghosting aplikasi di Azure. Identitas terkelola tidak memerlukan penyimpanan sertifikat di aplikasi atau di lingkungan pengembangan.

Aplikasi sampel menggunakan ID Aplikasi dan sertifikat X.509 saat #define direktif prapemrosea di bagian Program.cs atas diatur ke Certificate.

  1. Buat sertifikat arsip PKCS#12 (.pfx). Opsi untuk membuat sertifikat termasuk New-SelfSignedCertificate di Windows dan OpenSSL.
  2. Instal sertifikat ke penyimpanan sertifikat pribadi pengguna saat ini. Menandai kunci sebagai dapat diekspor bersifat opsional. Perhatikan thumbprint sertifikat, yang digunakan nanti dalam proses ini.
  3. Ekspor sertifikat arsip PKCS#12 (.pfx) sebagai sertifikat yang dikodekan DER (.cer).
  4. Daftarkan aplikasi dengan Azure AD (Pendaftaran aplikasi).
  5. Unggah sertifikat yang dikodekan DER (.cer) ke Microsoft Azure AD:
    1. Pilih aplikasi di Azure ACTIVE Directory.
    2. Navigasikan ke Sertifikat & rahasia.
    3. Pilih Unggah sertifikat untuk mengunggah sertifikat, yang berisi kunci publik. Sertifikat .cer, .pem, atau .crt dapat diterima.
  6. Simpan nama Key Vault, ID Aplikasi, dan thumbprint sertifikat dalam file aplikasi appsettings.json .
  7. Navigasikan ke Key Vault di portal Azure.
  8. Pilih Key Vault yang Anda buat di penyimpanan Rahasia di bagian Lingkungan produksi dengan Azure Key Vault .
  9. Pilih Kebijakan akses.
  10. Pilih Tambahkan Kebijakan Akses.
  11. Buka izin Rahasia dan berikan izin Dapatkan dan Daftar aplikasi.
  12. Pilih Pilih prinsipal dan pilih aplikasi terdaftar berdasarkan nama. Pilih tombol Pilih.
  13. Pilih OK.
  14. Pilih Simpan.
  15. Sebarkan aplikasi.

Aplikasi Certificate sampel mendapatkan nilai konfigurasinya dari IConfigurationRoot dengan nama yang sama dengan nama rahasia:

  • Nilai non-hierarkis: Nilai untuk SecretName diperoleh dengan config["SecretName"].
  • Nilai hierarkis (bagian): Gunakan : notasi (titik dua) atau GetSection metode . Gunakan salah satu pendekatan ini untuk mendapatkan nilai konfigurasi:
    • config["Section:SecretName"]
    • config.GetSection("Section")["SecretName"]

Sertifikat X.509 dikelola oleh OS. Aplikasi memanggil dengan nilai yang AddAzureKeyVault disediakan oleh appsettings.json file:

// using System.Linq;
// using System.Security.Cryptography.X509Certificates;
// using Azure.Extensions.AspNetCore.Configuration.Secrets;
// using Azure.Identity;

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            if (context.HostingEnvironment.IsProduction())
            {
                var builtConfig = config.Build();

                using var store = new X509Store(StoreLocation.CurrentUser);
                store.Open(OpenFlags.ReadOnly);
                var certs = store.Certificates.Find(
                    X509FindType.FindByThumbprint,
                    builtConfig["AzureADCertThumbprint"], false);

                config.AddAzureKeyVault(new Uri($"https://{builtConfig["KeyVaultName"]}.vault.azure.net/"),
                                        new ClientCertificateCredential(builtConfig["AzureADDirectoryId"], builtConfig["AzureADApplicationId"], certs.OfType<X509Certificate2>().Single()),
                                        new KeyVaultSecretManager());

                store.Close();
            }
        })
        .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());

Nilai contoh:

  • Nama Key Vault: contosovault
  • ID Aplikasi: 627e911e-43cc-61d4-992e-12db9c81b413
  • Thumbprint sertifikat: fe14593dd66b2406c5269d742d04b6e1ab03adb1

appsettings.json:

{
  "KeyVaultName": "Key Vault Name",
  "AzureADApplicationId": "Azure AD Application ID",
  "AzureADCertThumbprint": "Azure AD Certificate Thumbprint",
  "AzureADDirectoryId": "Azure AD Directory ID"
}

Saat Anda menjalankan aplikasi, halaman web menampilkan nilai rahasia yang dimuat. Di lingkungan Pengembangan, nilai rahasia dimuat dengan akhiran _dev . Di lingkungan Produksi, nilai dimuat dengan akhiran _prod .

Menggunakan identitas terkelola untuk sumber daya Azure

Aplikasi yang disebarkan ke Azure dapat memanfaatkan Identitas terkelola untuk sumber daya Azure. Identitas terkelola memungkinkan aplikasi untuk mengautentikasi dengan Azure Key Vault menggunakan autentikasi Azure AD tanpa kredensial (ID Aplikasi dan Kata Sandi/Rahasia Klien) yang disimpan di aplikasi.

Aplikasi sampel menggunakan identitas terkelola untuk sumber daya Azure saat #define arahan prapemrosana di bagian Program.cs atas diatur ke Managed.

Masukkan nama vault ke dalam file aplikasi appsettings.json . Aplikasi sampel tidak memerlukan ID Aplikasi dan Kata Sandi (Rahasia Klien) saat diatur ke versi, sehingga Anda dapat mengabaikan entri konfigurasi tersebut Managed . Aplikasi ini disebarkan ke Azure, dan Azure mengautentikasi aplikasi untuk mengakses Azure Key Vault hanya menggunakan nama vault yang disimpan dalam appsettings.json file.

Sebarkan aplikasi sampel ke Azure App Service.

Aplikasi yang disebarkan ke Azure App Service secara otomatis didaftarkan ke Microsoft Azure ACTIVE Directory saat layanan dibuat. Dapatkan ID Objek dari penyebaran untuk digunakan dalam perintah berikut. ID Objek ditampilkan di portal Azure pada Identity panel App Service.

Menggunakan Azure CLI dan ID Objek aplikasi, berikan aplikasi dengan list izin dan get untuk mengakses vault:

az keyvault set-policy --name {KEY VAULT NAME} --object-id {OBJECT ID} --secret-permissions get list

Mulai ulang aplikasi menggunakan Azure CLI, PowerShell, atau portal Azure.

Aplikasi sampel:

  • Membuat instans DefaultAzureCredential kelas. Kredensial mencoba mendapatkan token akses dari lingkungan untuk sumber daya Azure.
  • SecretClient Baru dibuat dengan DefaultAzureCredential instans.
  • SecretClient Instans digunakan dengan KeyVaultSecretManager instans, yang memuat nilai rahasia dan mengganti tanda hubung ganda (--) dengan titik dua (:) dalam nama kunci.
// using Azure.Security.KeyVault.Secrets;
// using Azure.Identity;
// using Azure.Extensions.AspNetCore.Configuration.Secrets;

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            if (context.HostingEnvironment.IsProduction())
            {
                var builtConfig = config.Build();
                var secretClient = new SecretClient(
                    new Uri($"https://{builtConfig["KeyVaultName"]}.vault.azure.net/"),
                    new DefaultAzureCredential());
                config.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());
            }
        })
        .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());

Nilai contoh nama Key Vault: contosovault

appsettings.json:

{
  "KeyVaultName": "Key Vault Name"
}

Saat Anda menjalankan aplikasi, halaman web menampilkan nilai rahasia yang dimuat. Di lingkungan Pengembangan, nilai rahasia memiliki akhiran _dev karena disediakan oleh Secret Manager. Di lingkungan Produksi, nilai dimuat dengan akhiran _prod karena disediakan oleh Azure Key Vault.

Jika Anda menerima kesalahan Access denied , konfirmasikan bahwa aplikasi terdaftar di Microsoft Azure ACTIVE Directory dan menyediakan akses ke vault. Konfirmasikan bahwa Anda telah memulai ulang layanan di Azure.

Untuk informasi tentang menggunakan penyedia dengan identitas terkelola dan Azure Pipelines, lihat Membuat koneksi layanan Azure Resource Manager ke VM dengan identitas layanan terkelola.

Opsi konfigurasi

AddAzureKeyVault dapat menerima AzureKeyVaultConfigurationOptions objek:

config.AddAzureKeyVault(
    new SecretClient(
        new Uri("Your Key Vault Endpoint"),
        new DefaultAzureCredential(),
        new AzureKeyVaultConfigurationOptions())
    {
        ...
    });

Objek AzureKeyVaultConfigurationOptions berisi properti berikut.

Properti Deskripsi
Manager KeyVaultSecretManager instans yang digunakan untuk mengontrol pemuatan rahasia.
ReloadInterval TimeSpan untuk menunggu di antara upaya polling vault untuk perubahan. Nilai defaultnya adalah null (konfigurasi tidak dimuat ulang).

Menggunakan awalan nama kunci

AddAzureKeyVault menyediakan kelebihan beban yang menerima implementasi KeyVaultSecretManager, yang memungkinkan Anda mengontrol bagaimana rahasia Key Vault dikonversi menjadi kunci konfigurasi. Misalnya, Anda dapat mengimplementasikan antarmuka untuk memuat nilai rahasia berdasarkan nilai awalan yang Anda berikan saat memulai aplikasi. Teknik ini memungkinkan Anda, misalnya, memuat rahasia berdasarkan versi aplikasi.

Peringatan

Jangan gunakan awalan pada rahasia Key Vault untuk:

  • Tempatkan rahasia untuk beberapa aplikasi ke dalam vault yang sama.
  • Tempatkan rahasia lingkungan (misalnya, pengembangan versus rahasia produksi ) ke dalam vault yang sama.

Aplikasi dan lingkungan pengembangan/produksi yang berbeda harus menggunakan Key Vault terpisah untuk mengisolasi lingkungan aplikasi untuk tingkat keamanan tertinggi.

Dalam contoh berikut, rahasia dibuat di Key Vault (dan menggunakan Secret Manager untuk lingkungan Pengembangan) untuk 5000-AppSecret (periode tidak diizinkan dalam nama rahasia Key Vault). Rahasia ini mewakili rahasia aplikasi untuk aplikasi versi 5.0.0.0. Untuk versi aplikasi lain, 5.1.0.0, rahasia ditambahkan ke vault (dan menggunakan Secret Manager) untuk 5100-AppSecret. Setiap versi aplikasi memuat nilai rahasia versinya ke dalam konfigurasinya sebagai AppSecret, menghapus versi saat memuat rahasia.

AddAzureKeyVault dipanggil dengan implementasi kustom KeyVaultSecretManager :

config.AddAzureKeyVault(
    $"https://{builtConfig["KeyVaultName"]}.vault.azure.net/",
    builtConfig["AzureADApplicationId"],
    certs.OfType<X509Certificate2>().Single(),
    new PrefixKeyVaultSecretManager(versionPrefix));

Implementasi bereaksi terhadap awalan versi rahasia untuk memuat rahasia yang tepat ke dalam konfigurasi:

  • Load memuat rahasia ketika namanya dimulai dengan awalan. Rahasia lain tidak dimuat.
  • GetKey:
    • Menghapus awalan dari nama rahasia.
    • Mengganti dua tanda hubung dalam nama apa pun dengan KeyDelimiter, yang merupakan pemisah yang digunakan dalam konfigurasi (biasanya titik dua). Azure Key Vault tidak mengizinkan titik dua dalam nama rahasia.
public class PrefixKeyVaultSecretManager : KeyVaultSecretManager
{
    private readonly string _prefix;

    public PrefixKeyVaultSecretManager(string prefix)
    {
        _prefix = $"{prefix}-";
    }

    public override bool Load(SecretProperties secret)
    {
        return secret.Name.StartsWith(_prefix);
    }

    public override string GetKey(KeyVaultSecret secret)
    {
        return secret.Name
            .Substring(_prefix.Length)
            .Replace("--", ConfigurationPath.KeyDelimiter);
    }
}

Metode Load ini dipanggil oleh algoritma penyedia yang melakukan iterasi melalui rahasia vault untuk menemukan rahasia awalan versi. Ketika awalan versi ditemukan dengan Load, algoritma menggunakan GetKey metode untuk mengembalikan nama konfigurasi nama rahasia. Ini menghapus awalan versi dari nama rahasia. Nama rahasia lainnya dikembalikan untuk dimuat ke dalam pasangan nama-nilai konfigurasi aplikasi.

Ketika pendekatan ini diimplementasikan:

  1. Versi aplikasi yang ditentukan dalam file proyek aplikasi. Dalam contoh berikut, versi aplikasi diatur ke 5.0.0.0:

    <PropertyGroup>
      <Version>5.0.0.0</Version>
    </PropertyGroup>
    
  2. Konfirmasikan bahwa <UserSecretsId> properti ada dalam file proyek aplikasi, di mana {GUID} adalah GUID yang disediakan pengguna:

    <PropertyGroup>
      <UserSecretsId>{GUID}</UserSecretsId>
    </PropertyGroup>
    

    Simpan rahasia berikut secara lokal dengan Secret Manager:

    dotnet user-secrets set "5000-AppSecret" "5.0.0.0_secret_value_dev"
    dotnet user-secrets set "5100-AppSecret" "5.1.0.0_secret_value_dev"
    
  3. Rahasia disimpan di Azure Key Vault menggunakan perintah Azure CLI berikut:

    az keyvault secret set --vault-name {KEY VAULT NAME} --name "5000-AppSecret" --value "5.0.0.0_secret_value_prod"
    az keyvault secret set --vault-name {KEY VAULT NAME} --name "5100-AppSecret" --value "5.1.0.0_secret_value_prod"
    
  4. Saat aplikasi dijalankan, rahasia Key Vault dimuat. Rahasia string untuk 5000-AppSecret dicocokkan dengan versi aplikasi yang ditentukan dalam file proyek aplikasi (5.0.0.0).

  5. Versi , 5000 (dengan tanda hubung), dilucuti dari nama kunci. Di seluruh aplikasi, membaca konfigurasi dengan kunci AppSecret memuat nilai rahasia.

  6. Jika versi aplikasi diubah dalam file proyek ke 5.1.0.0 dan aplikasi dijalankan lagi, nilai rahasia yang dikembalikan berada 5.1.0.0_secret_value_dev di lingkungan Pengembangan dan 5.1.0.0_secret_value_prod di Produksi.

Catatan

Anda juga dapat memberikan implementasi Anda sendiri SecretClient ke AddAzureKeyVault. Klien kustom mengizinkan berbagi satu instans klien di seluruh aplikasi.

Mengikat array ke kelas

Penyedia dapat membaca nilai konfigurasi ke dalam array untuk mengikat ke array POCO.

Saat membaca dari sumber konfigurasi yang memungkinkan kunci berisi pemisah titik dua (:), segmen kunci numerik digunakan untuk membedakan kunci yang membentuk array (:0:, , :1:... :{n}:). Untuk informasi selengkapnya, lihat Konfigurasi: Mengikat array ke kelas.

Kunci Azure Key Vault tidak dapat menggunakan titik dua sebagai pemisah. Pendekatan yang dijelaskan dalam artikel ini menggunakan tanda hubung ganda (--) sebagai pemisah untuk nilai hierarkis (bagian). Kunci array disimpan di Azure Key Vault dengan tanda hubung ganda dan segmen kunci numerik (--0--, --1--, ... --{n}--).

Periksa konfigurasi penyedia pengelogan Serilog berikut yang JSdisediakan oleh file ON. Ada dua literal objek yang ditentukan dalam WriteTo array yang mencerminkan dua sink Serilog, yang menjelaskan tujuan untuk output pengelogan:

"Serilog": {
  "WriteTo": [
    {
      "Name": "AzureTableStorage",
      "Args": {
        "storageTableName": "logs",
        "connectionString": "DefaultEnd...ountKey=Eby8...GMGw=="
      }
    },
    {
      "Name": "AzureDocumentDB",
      "Args": {
        "endpointUrl": "https://contoso.documents.azure.com:443",
        "authorizationKey": "Eby8...GMGw=="
      }
    }
  ]
}

Konfigurasi yang ditampilkan dalam file ON sebelumnya JSdisimpan di Azure Key Vault menggunakan notasi tanda hubung ganda (--) dan segmen numerik:

Tombol Nilai
Serilog--WriteTo--0--Name AzureTableStorage
Serilog--WriteTo--0--Args--storageTableName logs
Serilog--WriteTo--0--Args--connectionString DefaultEnd...ountKey=Eby8...GMGw==
Serilog--WriteTo--1--Name AzureDocumentDB
Serilog--WriteTo--1--Args--endpointUrl https://contoso.documents.azure.com:443
Serilog--WriteTo--1--Args--authorizationKey Eby8...GMGw==

Memuat ulang rahasia

Rahasia di-cache sampai IConfigurationRoot.Reload dipanggil. Kemudian, rahasia yang dinonaktifkan atau diperbarui di vault tidak dihormati oleh aplikasi hingga Reload dijalankan.

Configuration.Reload();

Rahasia yang dinonaktifkan dan kedaluwarsa

Rahasia yang kedaluwarsa disertakan secara default di penyedia konfigurasi. Untuk mengecualikan nilai untuk rahasia ini dalam konfigurasi aplikasi, perbarui rahasia yang kedaluwarsa atau berikan konfigurasi menggunakan penyedia konfigurasi kustom:

class SampleKeyVaultSecretManager : KeyVaultSecretManager
{
  public override bool Load(SecretProperties properties) =>
    properties.ExpiresOn.HasValue &&
    properties.ExpiresOn.Value > DateTimeOffset.Now;
}

Teruskan kustom KeyVaultSecretManager ini ke AddAzureKeyVault:

// using Azure.Extensions.AspNetCore.Configuration.Secrets;

config.AddAzureKeyVault(
    new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
    new DefaultAzureCredential(),
    new SampleKeyVaultSecretManager());

Rahasia yang dinonaktifkan tidak dapat diambil dari Key Vault dan tidak pernah disertakan.

Pemecahan masalah

Saat aplikasi gagal memuat konfigurasi menggunakan penyedia, pesan kesalahan ditulis ke infrastruktur ASP.NET Core Logging. Kondisi berikut akan mencegah konfigurasi dimuat:

  • Aplikasi atau sertifikat tidak dikonfigurasi dengan benar di Azure AD.
  • Vault tidak ada di Azure Key Vault.
  • Aplikasi ini tidak berwenang untuk mengakses vault.
  • Kebijakan akses tidak termasuk Get dan List izin.
  • Di vault, data konfigurasi (pasangan nama-nilai) salah bernama, hilang, atau dinonaktifkan.
  • Aplikasi ini memiliki nama Key Vault (KeyVaultName), ID Aplikasi Azure AD (AzureADApplicationId), atau thumbprint sertifikat Azure AD (AzureADCertThumbprint), atau ID Direktori Azure AD (AzureADDirectoryId).
  • Saat menambahkan kebijakan akses Key Vault untuk aplikasi, kebijakan dibuat, tetapi tombol Simpan tidak dipilih di antarmuka pengguna Kebijakan akses.

Sumber daya tambahan