ASP.NET Core'da Azure Key Vault yapılandırma sağlayıcısı

Bu makalede Azure Key Vault gizli dizilerinden uygulama yapılandırma değerlerini yüklemek için Azure Key Vault yapılandırma sağlayıcısının nasıl kullanılacağı açıklanmaktadır. Azure Key Vault, uygulamalar ve hizmetler tarafından kullanılan şifreleme anahtarlarının ve gizli dizilerinin korunmasına yardımcı olan bulut tabanlı bir hizmettir. Azure Key Vault'un ASP.NET Core uygulamalarıyla kullanılmasına yönelik yaygın senaryolar şunlardır:

  • Hassas yapılandırma verilerine erişimi denetleme.
  • Yapılandırma verilerini depolarken FIPS 140-2 Düzey 2 doğrulanmış Donanım Güvenlik Modülleri (HSM) gereksinimini karşılar.

Paketler

Aşağıdaki paketler için paket başvuruları ekleyin:

Örnek uygulama

Örnek uygulama, en üstündeki önişlemci yönergesi tarafından #define belirlenen iki moddan Program.csbirinde çalışır:

  • Certificate: Azure Key Vault'ta depolanan gizli dizilere erişmek için Azure Key Vault İstemci Kimliği ve X.509 sertifikasının kullanılmasını gösterir. Bu örnek, Azure Uygulaması Hizmeti'ne veya ASP.NET Core uygulamasına hizmet verebilen herhangi bir ana bilgisayara dağıtılan herhangi bir konumdan çalıştırılabilir.
  • Managed: Azure kaynakları için Yönetilen kimliklerin nasıl kullanılacağını gösterir. Yönetilen kimlik, kimlik bilgilerini uygulamanın kodunda veya yapılandırmasında depolamadan Azure Active Directory (AD) kimlik doğrulaması ile uygulamanın Kimliğini Azure Key Vault'ta doğrular. Örneğin Managed sürümü Azure'a dağıtılmalıdır. Azure kaynakları için yönetilen kimlikleri kullanma bölümündeki yönergeleri izleyin.

Önişlemci yönergelerini ()#define kullanarak örnek bir uygulamayı yapılandırma hakkında daha fazla bilgi için bkz . ASP.NET Core'a genel bakış.

Örnek kodu görüntüleme veya indirme (indirme)

Geliştirme ortamında gizli depolama

Gizli Dizi Yöneticisi'ne giderek gizli dizileri yerel olarak ayarlayın. Örnek uygulama Geliştirme ortamındaki yerel makinede çalıştırıldığında, gizli diziler yerel kullanıcı gizli dizileri deposundan yüklenir.

Gizli Dizi Yöneticisi, uygulamanın proje dosyasında bir <UserSecretsId> özellik gerektirir. Özellik değerini ({GUID}) herhangi bir benzersiz GUID olarak ayarlayın:

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

Gizli diziler ad-değer çiftleri olarak oluşturulur. Hiyerarşik değerler (yapılandırma bölümleri), ASP.NET Temel yapılandırma anahtarı adlarında ayırıcı olarak bir (iki nokta üst üste) kullanır : .

Gizli Dizi Yöneticisi, projenin içerik köküne açılan bir komut kabuğundan kullanılır. Burada {SECRET NAME} ad ve {SECRET VALUE} değer:

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

Örnek uygulamanın gizli dizilerini ayarlamak için projenin içerik kökünden bir komut kabuğunda aşağıdaki komutları yürütebilirsiniz:

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

Bu gizli diziler, Azure Key Vault ile Üretim ortamındaki Gizli depolama alanında Azure Key Vault'ta depolandığında, _dev sonek olarak _proddeğiştirilir. Sonek, uygulamanın çıkışında yapılandırma değerlerinin kaynağını gösteren görsel bir ipucu sağlar.

Azure Key Vault ile Üretim ortamında gizli depolama

Azure Key Vault oluşturmak ve örnek uygulamanın gizli dizilerini bu kasada depolamak için aşağıdaki adımları tamamlayın. Daha fazla bilgi için bkz . Hızlı Başlangıç: Azure CLI kullanarak Azure Key Vault'tan gizli dizi ayarlama ve alma.

  1. Azure portalda aşağıdaki yöntemlerden birini kullanarak Azure Cloud Shell'i açın:

    • Kod bloğunun sağ üst köşesindeki Deneyin’i seçin. Metin kutusundaki "Azure CLI" arama dizesini kullanın.
    • Cloud Shell'i Başlat düğmesiyle tarayıcınızda Cloud Shell'i açın.
    • Azure portalının sağ üst köşesindeki menüden Cloud Shell düğmesini seçin.

    Daha fazla bilgi için bkz . Azure CLI ve Azure Cloud Shell'e Genel Bakış.

  2. Henüz kimliğiniz doğrulanmamışsa komutuyla az login oturum açın.

  3. Aşağıdaki komutu kullanarak bir kaynak grubu oluşturun; burada {RESOURCE GROUP NAME} yeni kaynak grubunun adı ve {LOCATION} Azure bölgesidir:

    az group create --name "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  4. Kaynak grubunda aşağıdaki komutu kullanarak bir Key Vault oluşturun; burada {KEY VAULT NAME} yeni kasanın adı ve {LOCATION} Azure bölgesidir:

    az keyvault create --name {KEY VAULT NAME} --resource-group "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  5. Kasada ad-değer çiftleri olarak gizli diziler oluşturun.

    Azure Key Vault gizli dizi adları alfasayısal karakterler ve kısa çizgilerle sınırlıdır. Anahtar Kasası gizli dizi adlarında iki nokta üst üste izin verilmediğinden hiyerarşik değerler (yapılandırma bölümleri) sınırlayıcı olarak (iki tire) kullanır -- . ASP.NET Core yapılandırmasındaki bir alt anahtardan bir bölümü iki nokta üst üste sınırlar. Gizli diziler uygulamanın yapılandırmasına yüklendiğinde iki tire dizisi iki nokta üst üste ile değiştirilir.

    Aşağıdaki gizli diziler örnek uygulamayla birlikte kullanılabilir. Değerler, Geliştirme ortamında Gizli Dizi Yöneticisi'nden yüklenen sonek değerlerinden _dev ayırt etmek için bir _prod sonek içerir. değerini önceki adımda oluşturduğunuz Key Vault adıyla değiştirin {KEY VAULT NAME} :

    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"
    

Azure'da barındırılan olmayan uygulamalar için Uygulama Kimliği ve X.509 sertifikası kullanma

Azure AD, Azure Key Vault ve uygulamayı azure dışında barındırıldığında bir kasada kimlik doğrulaması yapmak için Azure AD Uygulama Kimliği ve X.509 sertifikası kullanacak şekilde yapılandırın. Daha fazla bilgi için bkz . Anahtarlar, gizli diziler ve sertifikalar hakkında.

Dekont

Azure'da barındırılan uygulamalar için Uygulama Kimliği ve X.509 sertifikası kullanılması desteklense de önerilmez. Bunun yerine, Azure'da bir uygulamayı barındırırken Azure kaynakları için Yönetilen kimlikleri kullanın. Yönetilen kimlikler, uygulamada veya geliştirme ortamında sertifika depolamayı gerektirmez.

En üstündeki Program.cs önişlemci yönergesi olarak ayarlandığında Certificateörnek uygulama bir Uygulama Kimliği ve X.509 sertifikası #define kullanır.

  1. PKCS#12 arşiv (.pfx) sertifikası oluşturun. Sertifika oluşturma seçenekleri Arasında Windows'ta New-SelfSignedCertificate ve OpenSSL bulunur.
  2. Sertifikayı geçerli kullanıcının kişisel sertifika deposuna yükleyin. Anahtarı dışarı aktarılabilir olarak işaretlemek isteğe bağlıdır. Bu işlemin ilerleyen bölümlerinde kullanılan sertifikanın parmak izini not edin.
  3. PKCS#12 arşiv (.pfx) sertifikasını DER ile kodlanmış sertifika (.cer) olarak dışarı aktarın.
  4. Uygulamayı Azure AD'ye (Uygulama kayıtları) kaydedin.
  5. DER ile kodlanmış sertifikayı (.cer) Azure AD'ye yükleyin:
    1. Azure AD'de uygulamayı seçin.
    2. Sertifikalar ve gizli diziler'e gidin.
    3. Ortak anahtarı içeren sertifikayı karşıya yüklemek için Sertifikayı karşıya yükle'yi seçin. .cer, .pem veya .crt sertifikası kabul edilebilir.
  6. Key Vault adını, Uygulama Kimliği'ni ve sertifika parmak izini uygulamanın appsettings.json dosyasında depolayın.
  7. Azure portalında Key Vaults'a gidin.
  8. Azure Key Vault ile Üretim ortamındaki Gizli depolama alanında oluşturduğunuz Key Vault'ı seçin.
  9. Erişim ilkeleri'ni seçin.
  10. Erişim İlkesi Ekle'yi seçin.
  11. Gizli dizi izinlerini açın ve uygulamaya Alma ve Listeleme izinlerini sağlayın.
  12. Sorumlu seç'i seçin ve kayıtlı uygulamayı ada göre seçin. Seçim düğmesini seçin.
  13. Tamam seçeneğini işaretleyin.
  14. Kaydet'i seçin.
  15. Uygulamayı dağıtın.

Örnek uygulama, Certificate yapılandırma değerlerini gizli dizi adıyla aynı adla elde eder IConfigurationRoot :

  • Hiyerarşik olmayan değerler: değeri SecretName ile config["SecretName"]elde edilir.
  • Hiyerarşik değerler (bölümler): (iki nokta üst üste) gösterimini GetSection veya yöntemini kullanın : . Yapılandırma değerini almak için şu yaklaşımlardan birini kullanın:
    • config["Section:SecretName"]
    • config.GetSection("Section")["SecretName"]

X.509 sertifikası işletim sistemi tarafından yönetilir. Uygulama, dosya tarafından sağlanan değerlerle çağrılar AddAzureKeyVaultappsettings.json :


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();

Örnek değerler:

  • Key Vault adı: contosovault
  • Uygulama kimliği: 627e911e-43cc-61d4-992e-12db9c81b413
  • Sertifika parmak izi: fe14593dd66b2406c5269d742d04b6e1ab03adb1

appsettings.json:

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

Uygulamayı çalıştırdığınızda, bir web sayfası yüklenen gizli dizi değerlerini gösterir. Geliştirme ortamında gizli dizi değerleri sonekle birlikte _dev yüklenir. Üretim ortamında değerler sonekle birlikte _prod yüklenir.

Azure kaynakları için yönetilen kimlikleri kullanma

Azure'a dağıtılan bir uygulama, Azure kaynakları için Yönetilen kimliklerden yararlanabilir. Yönetilen kimlik, uygulamanın kodunda veya yapılandırmasında kimlik bilgilerini depolamadan Azure AD kimlik doğrulamasını kullanarak Azure Key Vault ile kimlik doğrulaması yapmasına olanak tanır.

En üstündeki Program.cs önişlemci yönergesi olarak ayarlandığında Managedörnek uygulama sistem tarafından atanan yönetilen kimliği #define kullanır. Azure Uygulaması Service uygulaması için yönetilen kimlik oluşturmak için bkz. App Service ve Azure İşlevleri için yönetilen kimlikleri kullanma. Yönetilen kimlik oluşturulduktan sonra, App Service panelinde Azure portalında Identity gösterilen uygulamanın Nesne Kimliğini not edin.

Uygulamanın appsettings.json dosyasına kasa adını girin. Örnek uygulama, sürüme Managed ayarlandığında Bir Uygulama Kimliği ve Parola (İstemci Gizli Anahtarı) gerektirmez, bu nedenle bu yapılandırma girdilerini yoksayabilirsiniz. Uygulama Azure'a dağıtılır ve Azure yalnızca dosyada depolanan kasa adını kullanarak Azure Key Vault'a appsettings.json erişmek için uygulamanın kimliğini doğrular.

Örnek uygulamayı Azure Uygulaması Hizmetine dağıtın.

Azure CLI'yı ve uygulamanın Nesne Kimliğini kullanarak uygulamaya list kasaya erişmek için ve get izinleri sağlayın:

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

Azure CLI, PowerShell veya Azure portalını kullanarak uygulamayı yeniden başlatın.

Örnek uygulama sınıfının bir örneğini DefaultAzureCredential oluşturur. Kimlik bilgisi, Azure kaynakları için ortamdan erişim belirteci almayı dener:

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());
}

Key Vault adı örnek değeri: contosovault

appsettings.json:

{
  "KeyVaultName": "Key Vault Name"
}

Kullanıcı tarafından atanan yönetilen kimlik kullanan uygulamalar için, aşağıdaki yaklaşımlardan birini kullanarak yönetilen kimliğin İstemci Kimliğini yapılandırın:

  1. AZURE_CLIENT_ID ortam değişkenini ayarlayın.

  2. DefaultAzureCredentialOptions.ManagedIdentityClientId çağrısı AddAzureKeyVaultyaparken özelliğini ayarlayın:

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

Uygulamayı çalıştırdığınızda, bir web sayfası yüklenen gizli dizi değerlerini gösterir. Geliştirme ortamında gizli dizi değerleri, Gizli Dizi Yöneticisi tarafından sağlandığı için son eke sahiptir _dev . Üretim ortamında değerler, Azure Key Vault tarafından sağlandığı için sonekle birlikte _prod yüklenir.

Hata Access denied alırsanız uygulamanın Azure AD'ye kaydedildiğini ve kasaya erişim sağlandığını onaylayın. Hizmeti Azure'da yeniden başlattığınızdan emin olun.

Sağlayıcıyı yönetilen kimlik ve Azure Pipelines ile kullanma hakkında bilgi için bkz . Yönetilen hizmet kimliğine sahip bir VM'ye Azure Resource Manager hizmet bağlantısı oluşturma.

Yapılandırma seçenekleri

AddAzureKeyVault bir AzureKeyVaultConfigurationOptions nesneyi kabul edebilir:

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

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

AzureKeyVaultConfigurationOptions nesnesi aşağıdaki özellikleri içerir:

Özellik Açıklama
Manager KeyVaultSecretManager gizli dizi yüklemesini denetlemek için kullanılan örnek.
ReloadInterval TimeSpan öğesini seçerek kasayı yoklama girişimleri arasında değişiklik yapmak için beklemeniz gerekir. Varsayılan değerdir null (yapılandırma yeniden yüklenmez).

Anahtar adı ön eki kullanma

AddAzureKeyVault , Key Vault gizli dizilerinin KeyVaultSecretManageryapılandırma anahtarlarına nasıl dönüştürüldüğünü denetlemenize olanak tanıyan uygulamasını kabul eden bir aşırı yükleme sağlar. Örneğin, uygulama başlangıcında sağladığınız bir ön ek değerine göre gizli dizi değerlerini yüklemek için arabirimini uygulayabilirsiniz. Bu teknik, örneğin uygulamanın sürümüne göre gizli dizileri yüklemenizi sağlar.

Uyarı

Aşağıdakiler için Key Vault gizli dizilerinde ön ek kullanmayın:

  • Birden çok uygulamanın gizli dizilerini aynı kasaya yerleştirin.
  • Ortam gizli dizilerini (örneğin, geliştirme ve üretim gizli dizileri) aynı kasaya yerleştirin.

Farklı uygulamalar ve geliştirme/üretim ortamları, uygulama ortamlarını en yüksek güvenlik düzeyi için yalıtmak için ayrı Key Vault'lar kullanmalıdır.

Aşağıdaki örnekte, Key Vault'ta (ve Geliştirme ortamı için Gizli Dizi Yöneticisi kullanılarak) için 5000-AppSecret bir gizli dizi oluşturulur (Anahtar Kasası gizli dizi adlarında dönemlere izin verilmez). Bu gizli dizi, uygulamanın 5.0.0.0 sürümü için bir uygulama gizli dizisini temsil eder. Uygulamanın başka bir sürümü olan 5.1.0.0 için 5100-AppSecret, için kasaya bir gizli dizi eklenir (ve Gizli Dizi Yöneticisi kullanılır). Her uygulama sürümü, sürümüne ait gizli dizi değerini olarak AppSecretyapılandırmasına yükler ve gizli diziyi yüklerken sürümü kaldırır.

AddAzureKeyVault özel KeyVaultSecretManager bir uygulamayla çağrılır:

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

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

Uygulama, yapılandırmaya uygun gizli diziyi yüklemek için gizli dizilerin sürüm ön eklerine tepki sağlar:

  • Load adı ön ek ile başladığında bir gizli dizi yükler. Diğer gizli diziler yüklenmez.
  • GetKey:
    • Gizli dizi adından ön eki kaldırır.
    • Herhangi bir addaki iki tireyi KeyDelimiter, yapılandırmada kullanılan sınırlayıcı (genellikle iki nokta üst üste) olan ile değiştirir. Azure Key Vault gizli dizi adlarında iki nokta üst üste izin vermez.
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);
}

Load yöntemi, sürüm ön ekli gizli dizileri bulmak için kasa gizli dizileri arasında yinelenen bir sağlayıcı algoritması tarafından çağrılır. ile Loadbir sürüm ön eki bulunduğunda algoritma, gizli dizi adının yapılandırma adını döndürmek için yöntemini kullanır GetKey . Gizli dizinin adından sürüm ön ekini kaldırır. Gizli dizi adının geri kalanı, uygulamanın yapılandırma adı-değer çiftlerine yüklenmek üzere döndürülür.

Bu yaklaşım uygulandığında:

  1. Uygulamanın proje dosyasında belirtilen sürümü. Aşağıdaki örnekte, uygulamanın sürümü olarak 5.0.0.0ayarlanmıştır:

    <PropertyGroup>
      <Version>5.0.0.0</Version>
    </PropertyGroup>
    
  2. Bir özelliğin <UserSecretsId> , kullanıcının sağladığı GUID'nin bulunduğu {GUID} uygulamanın proje dosyasında mevcut olduğunu onaylayın:

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

    Gizli Dizi Yöneticisi ile aşağıdaki gizli dizileri yerel olarak kaydedin:

    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. Gizli diziler aşağıdaki Azure CLI komutları kullanılarak Azure Key Vault'a kaydedilir:

    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. Uygulama çalıştırıldığında Key Vault gizli dizileri yüklenir. için 5000-AppSecret dize gizli dizisi, uygulamanın proje dosyasında (5.0.0.0 ) belirtilen sürümüyle eşleştirilir.

  5. Sürüm ( 5000 tire ile), anahtar adından çıkarılır. Uygulama genelinde anahtarla AppSecret okuma yapılandırması gizli dizi değerini yükler.

  6. Proje dosyasında 5.1.0.0 uygulamanın sürümü olarak değiştirilirse ve uygulama yeniden çalıştırılırsa, döndürülen gizli dizi değeri Geliştirme ortamında ve 5.1.0.0_secret_value_prod Üretim'de olur5.1.0.0_secret_value_dev.

Dekont

kendi uygulamanızı da sağlayabilirsiniz SecretClientAddAzureKeyVault. Özel istemci, istemcinin tek bir örneğinin uygulama genelinde paylaşılmasına izin verir.

Bir diziyi sınıfa bağlama

Sağlayıcı, poco dizisine bağlama için yapılandırma değerlerini bir diziye okuyabilir.

Anahtarların iki nokta (:) ayırıcıları içermesine izin veren bir yapılandırma kaynağından okurken, bir diziyi oluşturan anahtarları (:0:, :1:, ... :{n}:) ayırt etmek için sayısal bir anahtar kesimi kullanılır. Daha fazla bilgi için bkz . Yapılandırma: Diziyi bir sınıfa bağlama.

Azure Key Vault anahtarları ayırıcı olarak iki nokta üst üste kullanamaz. Bu makalede açıklanan yaklaşım, hiyerarşik değerler (bölümler) için ayırıcı olarak çift tireler (--) kullanır. Dizi anahtarları, Azure Key Vault'ta çift tireler ve sayısal anahtar kesimleri (--0--, --1--, ... --{n}--) ile depolanır.

ON JSdosyası tarafından sağlanan aşağıdaki Serilog günlüğü sağlayıcısı yapılandırmasını inceleyin. Dizide WriteTo , günlüğe kaydetme çıkışına yönelik hedefleri açıklayan iki Serilog havuzu yansıtan iki nesne değişmez değeri vardır:

"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=="
      }
    }
  ]
}

Yukarıdaki JSON dosyasında gösterilen yapılandırma, çift tire (--) gösterimi ve sayısal kesimler kullanılarak Azure Key Vault'ta depolanır:

Anahtar Değer
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==

Gizli dizileri yeniden yükleme

Varsayılan olarak, gizli diziler uygulamanın ömrü boyunca yapılandırma sağlayıcısı tarafından önbelleğe alınır. Kasada daha sonra devre dışı bırakılan veya güncelleştirilen gizli diziler uygulama tarafından yoksayılır.

Gizli dizileri yeniden yüklemek için öğesini çağırabilirsiniz IConfigurationRoot.Reload:

config.Reload();

Gizli dizileri belirli aralıklarla yeniden yüklemek için özelliğini ayarlayın AzureKeyVaultConfigurationOptions.ReloadInterval . Daha fazla bilgi için bkz . Yapılandırma seçenekleri.

Devre dışı bırakılmış ve süresi dolmuş gizli diziler

Süresi dolan gizli diziler varsayılan olarak yapılandırma sağlayıcısına eklenir. Uygulama yapılandırmasında bu gizli dizilerin değerlerini dışlamak için süresi dolan gizli diziyi güncelleştirin veya özel bir yapılandırma sağlayıcısı kullanarak yapılandırmayı sağlayın:

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

Bu özel öğeyi KeyVaultSecretManager ' ye geçirin AddAzureKeyVault:

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

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

Devre dışı bırakılan gizli diziler Key Vault'tan alınamaz ve hiçbir zaman dahil edilemez.

Sorun giderme

Uygulama sağlayıcıyı kullanarak yapılandırmayı yükleyemezse ASP.NET Çekirdek Günlüğü altyapısına bir hata iletisi yazılır. Aşağıdaki koşullar yapılandırmanın yüklenmesini engeller:

  • Uygulama veya sertifika Azure AD'de doğru yapılandırılmamış.
  • Kasa Azure Key Vault'ta mevcut değildir.
  • Uygulamanın kasaya erişme yetkisi yoktur.
  • Erişim ilkesi ve List izinlerini içermezGet.
  • Kasada yapılandırma verileri (ad-değer çifti) yanlış adlandırılmış, eksik veya devre dışı bırakılmış.
  • Uygulama yanlış Key Vault adına (KeyVaultName), Azure AD Uygulama Kimliğine (AzureADApplicationId) veya Azure AD sertifika parmak izine (AzureADCertThumbprint) veya Azure AD Dizin Kimliğine ( )AzureADDirectoryId sahip.
  • Uygulama için Key Vault erişim ilkesi eklenirken ilke oluşturuldu, ancak Erişim ilkeleri kullanıcı arabiriminde Kaydet düğmesi seçilmedi.

Ek kaynaklar

Bu makalede Azure Key Vault gizli dizilerinden uygulama yapılandırma değerlerini yüklemek için Azure Key Vault yapılandırma sağlayıcısının nasıl kullanılacağı açıklanmaktadır. Azure Key Vault, uygulamalar ve hizmetler tarafından kullanılan şifreleme anahtarlarının ve gizli dizilerinin korunmasına yardımcı olan bulut tabanlı bir hizmettir. Azure Key Vault'un ASP.NET Core uygulamalarıyla kullanılmasına yönelik yaygın senaryolar şunlardır:

  • Hassas yapılandırma verilerine erişimi denetleme.
  • Yapılandırma verilerini depolarken FIPS 140-2 Düzey 2 doğrulanmış Donanım Güvenlik Modülleri (HSM) gereksinimini karşılar.

Paketler

Aşağıdaki paketler için paket başvuruları ekleyin:

Örnek uygulama

Örnek uygulama, en üstündeki önişlemci yönergesi tarafından #define belirlenen iki moddan Program.csbirinde çalışır:

  • Certificate: Azure Key Vault'ta depolanan gizli dizilere erişmek için Azure Key Vault İstemci Kimliği ve X.509 sertifikasının kullanılmasını gösterir. Bu örnek, Azure Uygulaması Hizmeti'ne veya ASP.NET Core uygulamasına hizmet verebilen herhangi bir ana bilgisayara dağıtılan herhangi bir konumdan çalıştırılabilir.
  • Managed: Azure kaynakları için Yönetilen kimliklerin nasıl kullanılacağını gösterir. Yönetilen kimlik, uygulamanın kodunda veya yapılandırmasında depolanan kimlik bilgileri olmadan Azure Active Directory (AD) kimlik doğrulaması ile uygulamanın Kimliğini Azure Key Vault'ta doğrular. Kimlik doğrulaması için yönetilen kimlikler kullanılırken Azure AD Uygulama Kimliği ve Parolası (İstemci Gizli Anahtarı) gerekmez. Örneğin Managed sürümü Azure'a dağıtılmalıdır. Azure kaynakları için yönetilen kimlikleri kullanma bölümündeki yönergeleri izleyin.

Önişlemci yönergelerini ()#define kullanarak örnek bir uygulamayı yapılandırma hakkında daha fazla bilgi için bkz . ASP.NET Core'a genel bakış.

Örnek kodu görüntüleme veya indirme (indirme)

Geliştirme ortamında gizli depolama

Gizli Dizi Yöneticisi'ne giderek gizli dizileri yerel olarak ayarlayın. Örnek uygulama Geliştirme ortamındaki yerel makinede çalıştırıldığında, gizli diziler yerel kullanıcı gizli dizileri deposundan yüklenir.

Gizli Dizi Yöneticisi, uygulamanın proje dosyasında bir <UserSecretsId> özellik gerektirir. Özellik değerini ({GUID}) herhangi bir benzersiz GUID olarak ayarlayın:

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

Gizli diziler ad-değer çiftleri olarak oluşturulur. Hiyerarşik değerler (yapılandırma bölümleri), ASP.NET Temel yapılandırma anahtarı adlarında ayırıcı olarak bir (iki nokta üst üste) kullanır : .

Gizli Dizi Yöneticisi, projenin içerik köküne açılan bir komut kabuğundan kullanılır. Burada {SECRET NAME} ad ve {SECRET VALUE} değer:

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

Örnek uygulamanın gizli dizilerini ayarlamak için projenin içerik kökünden bir komut kabuğunda aşağıdaki komutları yürütebilirsiniz:

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

Bu gizli diziler, Azure Key Vault ile Üretim ortamındaki Gizli depolama alanında Azure Key Vault'ta depolandığında, _dev sonek olarak _proddeğiştirilir. Sonek, uygulamanın çıkışında yapılandırma değerlerinin kaynağını gösteren görsel bir ipucu sağlar.

Azure Key Vault ile Üretim ortamında gizli depolama

Azure Key Vault oluşturmak ve örnek uygulamanın gizli dizilerini bu kasada depolamak için aşağıdaki adımları tamamlayın. Daha fazla bilgi için bkz . Hızlı Başlangıç: Azure CLI kullanarak Azure Key Vault'tan gizli dizi ayarlama ve alma.

  1. Azure portalda aşağıdaki yöntemlerden birini kullanarak Azure Cloud Shell'i açın:

    • Kod bloğunun sağ üst köşesindeki Deneyin’i seçin. Metin kutusundaki "Azure CLI" arama dizesini kullanın.
    • Cloud Shell'i Başlat düğmesiyle tarayıcınızda Cloud Shell'i açın.
    • Azure portalının sağ üst köşesindeki menüden Cloud Shell düğmesini seçin.

    Daha fazla bilgi için bkz . Azure CLI ve Azure Cloud Shell'e Genel Bakış.

  2. Henüz kimliğiniz doğrulanmamışsa komutuyla az login oturum açın.

  3. Aşağıdaki komutu kullanarak bir kaynak grubu oluşturun; burada {RESOURCE GROUP NAME} yeni kaynak grubunun adı ve {LOCATION} Azure bölgesidir:

    az group create --name "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  4. Kaynak grubunda aşağıdaki komutu kullanarak bir Key Vault oluşturun; burada {KEY VAULT NAME} yeni kasanın adı ve {LOCATION} Azure bölgesidir:

    az keyvault create --name {KEY VAULT NAME} --resource-group "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  5. Kasada ad-değer çiftleri olarak gizli diziler oluşturun.

    Azure Key Vault gizli dizi adları alfasayısal karakterler ve kısa çizgilerle sınırlıdır. Anahtar Kasası gizli dizi adlarında iki nokta üst üste izin verilmediğinden hiyerarşik değerler (yapılandırma bölümleri) sınırlayıcı olarak (iki tire) kullanır -- . ASP.NET Core yapılandırmasındaki bir alt anahtardan bir bölümü iki nokta üst üste sınırlar. Gizli diziler uygulamanın yapılandırmasına yüklendiğinde iki tire dizisi iki nokta üst üste ile değiştirilir.

    Aşağıdaki gizli diziler örnek uygulamayla birlikte kullanılabilir. Değerler, Geliştirme ortamında Gizli Dizi Yöneticisi'nden yüklenen sonek değerlerinden _dev ayırt etmek için bir _prod sonek içerir. değerini önceki adımda oluşturduğunuz Key Vault adıyla değiştirin {KEY VAULT NAME} :

    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"
    

Azure'da barındırılan olmayan uygulamalar için Uygulama Kimliği ve X.509 sertifikası kullanma

Azure AD, Azure Key Vault ve uygulamayı azure dışında barındırıldığında bir kasada kimlik doğrulaması yapmak için Azure AD Uygulama Kimliği ve X.509 sertifikası kullanacak şekilde yapılandırın. Daha fazla bilgi için bkz . Anahtarlar, gizli diziler ve sertifikalar hakkında.

Dekont

Azure'da barındırılan uygulamalar için Uygulama Kimliği ve X.509 sertifikası kullanılması desteklense de önerilmez. Bunun yerine, Azure'da bir uygulamayı barındırırken Azure kaynakları için Yönetilen kimlikleri kullanın. Yönetilen kimlikler, uygulamada veya geliştirme ortamında sertifika depolamayı gerektirmez.

En üstündeki Program.cs önişlemci yönergesi olarak ayarlandığında Certificateörnek uygulama bir Uygulama Kimliği ve X.509 sertifikası #define kullanır.

  1. PKCS#12 arşiv (.pfx) sertifikası oluşturun. Sertifika oluşturma seçenekleri Arasında Windows'ta New-SelfSignedCertificate ve OpenSSL bulunur.
  2. Sertifikayı geçerli kullanıcının kişisel sertifika deposuna yükleyin. Anahtarı dışarı aktarılabilir olarak işaretlemek isteğe bağlıdır. Bu işlemin ilerleyen bölümlerinde kullanılan sertifikanın parmak izini not edin.
  3. PKCS#12 arşiv (.pfx) sertifikasını DER ile kodlanmış sertifika (.cer) olarak dışarı aktarın.
  4. Uygulamayı Azure AD'ye (Uygulama kayıtları) kaydedin.
  5. DER ile kodlanmış sertifikayı (.cer) Azure AD'ye yükleyin:
    1. Azure AD'de uygulamayı seçin.
    2. Sertifikalar ve gizli diziler'e gidin.
    3. Ortak anahtarı içeren sertifikayı karşıya yüklemek için Sertifikayı karşıya yükle'yi seçin. .cer, .pem veya .crt sertifikası kabul edilebilir.
  6. Key Vault adını, Uygulama Kimliği'ni ve sertifika parmak izini uygulamanın appsettings.json dosyasında depolayın.
  7. Azure portalında Key Vaults'a gidin.
  8. Azure Key Vault ile Üretim ortamındaki Gizli depolama alanında oluşturduğunuz Key Vault'ı seçin.
  9. Erişim ilkeleri'ni seçin.
  10. Erişim İlkesi Ekle'yi seçin.
  11. Gizli dizi izinlerini açın ve uygulamaya Alma ve Listeleme izinlerini sağlayın.
  12. Sorumlu seç'i seçin ve kayıtlı uygulamayı ada göre seçin. Seçim düğmesini seçin.
  13. Tamam seçeneğini işaretleyin.
  14. Kaydet'i seçin.
  15. Uygulamayı dağıtın.

Örnek uygulama, Certificate yapılandırma değerlerini gizli dizi adıyla aynı adla elde eder IConfigurationRoot :

  • Hiyerarşik olmayan değerler: değeri SecretName ile config["SecretName"]elde edilir.
  • Hiyerarşik değerler (bölümler): (iki nokta üst üste) gösterimini GetSection veya yöntemini kullanın : . Yapılandırma değerini almak için şu yaklaşımlardan birini kullanın:
    • config["Section:SecretName"]
    • config.GetSection("Section")["SecretName"]

X.509 sertifikası işletim sistemi tarafından yönetilir. Uygulama, dosya tarafından sağlanan değerlerle çağrılar AddAzureKeyVaultappsettings.json :

// 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>());

Örnek değerler:

  • Key Vault adı: contosovault
  • Uygulama kimliği: 627e911e-43cc-61d4-992e-12db9c81b413
  • Sertifika parmak izi: fe14593dd66b2406c5269d742d04b6e1ab03adb1

appsettings.json:

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

Uygulamayı çalıştırdığınızda, bir web sayfası yüklenen gizli dizi değerlerini gösterir. Geliştirme ortamında gizli dizi değerleri sonekle birlikte _dev yüklenir. Üretim ortamında değerler sonekle birlikte _prod yüklenir.

Azure kaynakları için yönetilen kimlikleri kullanma

Azure'a dağıtılan bir uygulama, Azure kaynakları için Yönetilen kimliklerden yararlanabilir. Yönetilen kimlik, uygulamanın kimlik bilgileri (Uygulama Kimliği ve Parola/İstemci Gizli Anahtarı) olmadan Azure AD kimlik doğrulamasını kullanarak Azure Key Vault ile kimlik doğrulaması yapmasına olanak tanır.

En üstündeki Program.cs önişlemci yönergesi olarak ayarlandığında Managedörnek uygulama Azure kaynakları #define için yönetilen kimlikleri kullanır.

Uygulamanın appsettings.json dosyasına kasa adını girin. Örnek uygulama, sürüme Managed ayarlandığında Bir Uygulama Kimliği ve Parola (İstemci Gizli Anahtarı) gerektirmez, bu nedenle bu yapılandırma girdilerini yoksayabilirsiniz. Uygulama Azure'a dağıtılır ve Azure yalnızca dosyada depolanan kasa adını kullanarak Azure Key Vault'a appsettings.json erişmek için uygulamanın kimliğini doğrular.

Örnek uygulamayı Azure Uygulaması Hizmetine dağıtın.

Azure Uygulaması Hizmetine dağıtılan bir uygulama, hizmet oluşturulduğunda Azure AD'ye otomatik olarak kaydedilir. Aşağıdaki komutta kullanmak üzere dağıtımdan Nesne Kimliğini alın. Nesne Kimliği, App Service panelindeki Identity Azure portalında gösterilir.

Azure CLI'yı ve uygulamanın Nesne Kimliğini kullanarak uygulamaya list kasaya erişmek için ve get izinleri sağlayın:

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

Azure CLI, PowerShell veya Azure portalını kullanarak uygulamayı yeniden başlatın.

Örnek uygulama:

  • DefaultAzureCredential sınıfının bir örneğini oluşturur. Kimlik bilgisi, Azure kaynakları için ortamdan erişim belirteci almayı dener.
  • Örnekle yeni SecretClientDefaultAzureCredential bir oluşturulur.
  • ÖrnekSecretClient, gizli değerleri yükleyen ve anahtar adlarında çift tireleri (--) iki nokta üst üste (:) ile değiştiren bir KeyVaultSecretManager örnekle kullanılır.
// 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>());

Key Vault adı örnek değeri: contosovault

appsettings.json:

{
  "KeyVaultName": "Key Vault Name"
}

Uygulamayı çalıştırdığınızda, bir web sayfası yüklenen gizli dizi değerlerini gösterir. Geliştirme ortamında gizli dizi değerleri, Gizli Dizi Yöneticisi tarafından sağlandığı için son eke sahiptir _dev . Üretim ortamında değerler, Azure Key Vault tarafından sağlandığı için sonekle birlikte _prod yüklenir.

Hata Access denied alırsanız uygulamanın Azure AD'ye kaydedildiğini ve kasaya erişim sağlandığını onaylayın. Hizmeti Azure'da yeniden başlattığınızdan emin olun.

Sağlayıcıyı yönetilen kimlik ve Azure Pipelines ile kullanma hakkında bilgi için bkz . Yönetilen hizmet kimliğine sahip bir VM'ye Azure Resource Manager hizmet bağlantısı oluşturma.

Yapılandırma seçenekleri

AddAzureKeyVault bir AzureKeyVaultConfigurationOptions nesneyi kabul edebilir:

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

AzureKeyVaultConfigurationOptions nesnesi aşağıdaki özellikleri içerir.

Özellik Açıklama
Manager KeyVaultSecretManager gizli dizi yüklemesini denetlemek için kullanılan örnek.
ReloadInterval TimeSpan öğesini seçerek kasayı yoklama girişimleri arasında değişiklik yapmak için beklemeniz gerekir. Varsayılan değerdir null (yapılandırma yeniden yüklenmez).

Anahtar adı ön eki kullanma

AddAzureKeyVault , Key Vault gizli dizilerinin KeyVaultSecretManageryapılandırma anahtarlarına nasıl dönüştürüldüğünü denetlemenize olanak tanıyan uygulamasını kabul eden bir aşırı yükleme sağlar. Örneğin, uygulama başlangıcında sağladığınız bir ön ek değerine göre gizli dizi değerlerini yüklemek için arabirimini uygulayabilirsiniz. Bu teknik, örneğin uygulamanın sürümüne göre gizli dizileri yüklemenizi sağlar.

Uyarı

Aşağıdakiler için Key Vault gizli dizilerinde ön ek kullanmayın:

  • Birden çok uygulamanın gizli dizilerini aynı kasaya yerleştirin.
  • Ortam gizli dizilerini (örneğin, geliştirme ve üretim gizli dizileri) aynı kasaya yerleştirin.

Farklı uygulamalar ve geliştirme/üretim ortamları, uygulama ortamlarını en yüksek güvenlik düzeyi için yalıtmak için ayrı Key Vault'lar kullanmalıdır.

Aşağıdaki örnekte, Key Vault'ta (ve Geliştirme ortamı için Gizli Dizi Yöneticisi kullanılarak) için 5000-AppSecret bir gizli dizi oluşturulur (Anahtar Kasası gizli dizi adlarında dönemlere izin verilmez). Bu gizli dizi, uygulamanın 5.0.0.0 sürümü için bir uygulama gizli dizisini temsil eder. Uygulamanın başka bir sürümü olan 5.1.0.0 için 5100-AppSecret, için kasaya bir gizli dizi eklenir (ve Gizli Dizi Yöneticisi kullanılır). Her uygulama sürümü, sürümüne ait gizli dizi değerini olarak AppSecretyapılandırmasına yükler ve gizli diziyi yüklerken sürümü kaldırır.

AddAzureKeyVault özel KeyVaultSecretManager bir uygulamayla çağrılır:

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

Uygulama, yapılandırmaya uygun gizli diziyi yüklemek için gizli dizilerin sürüm ön eklerine tepki sağlar:

  • Load adı ön ek ile başladığında bir gizli dizi yükler. Diğer gizli diziler yüklenmez.
  • GetKey:
    • Gizli dizi adından ön eki kaldırır.
    • Herhangi bir addaki iki tireyi KeyDelimiter, yapılandırmada kullanılan sınırlayıcı (genellikle iki nokta üst üste) olan ile değiştirir. Azure Key Vault gizli dizi adlarında iki nokta üst üste izin vermez.
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);
    }
}

Load yöntemi, sürüm ön ekli gizli dizileri bulmak için kasa gizli dizileri arasında yinelenen bir sağlayıcı algoritması tarafından çağrılır. ile Loadbir sürüm ön eki bulunduğunda algoritma, gizli dizi adının yapılandırma adını döndürmek için yöntemini kullanır GetKey . Gizli dizinin adından sürüm ön ekini kaldırır. Gizli dizi adının geri kalanı, uygulamanın yapılandırma adı-değer çiftlerine yüklenmek üzere döndürülür.

Bu yaklaşım uygulandığında:

  1. Uygulamanın proje dosyasında belirtilen sürümü. Aşağıdaki örnekte, uygulamanın sürümü olarak 5.0.0.0ayarlanmıştır:

    <PropertyGroup>
      <Version>5.0.0.0</Version>
    </PropertyGroup>
    
  2. Bir özelliğin <UserSecretsId> , kullanıcının sağladığı GUID'nin bulunduğu {GUID} uygulamanın proje dosyasında mevcut olduğunu onaylayın:

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

    Gizli Dizi Yöneticisi ile aşağıdaki gizli dizileri yerel olarak kaydedin:

    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. Gizli diziler aşağıdaki Azure CLI komutları kullanılarak Azure Key Vault'a kaydedilir:

    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. Uygulama çalıştırıldığında Key Vault gizli dizileri yüklenir. için 5000-AppSecret dize gizli dizisi, uygulamanın proje dosyasında (5.0.0.0 ) belirtilen sürümüyle eşleştirilir.

  5. Sürüm ( 5000 tire ile), anahtar adından çıkarılır. Uygulama genelinde anahtarla AppSecret okuma yapılandırması gizli dizi değerini yükler.

  6. Proje dosyasında 5.1.0.0 uygulamanın sürümü olarak değiştirilirse ve uygulama yeniden çalıştırılırsa, döndürülen gizli dizi değeri Geliştirme ortamında ve 5.1.0.0_secret_value_prod Üretim'de olur5.1.0.0_secret_value_dev.

Dekont

kendi uygulamanızı da sağlayabilirsiniz SecretClientAddAzureKeyVault. Özel istemci, istemcinin tek bir örneğinin uygulama genelinde paylaşılmasına izin verir.

Bir diziyi sınıfa bağlama

Sağlayıcı, poco dizisine bağlama için yapılandırma değerlerini bir diziye okuyabilir.

Anahtarların iki nokta (:) ayırıcıları içermesine izin veren bir yapılandırma kaynağından okurken, bir diziyi oluşturan anahtarları (:0:, :1:, ... :{n}:) ayırt etmek için sayısal bir anahtar kesimi kullanılır. Daha fazla bilgi için bkz . Yapılandırma: Diziyi bir sınıfa bağlama.

Azure Key Vault anahtarları ayırıcı olarak iki nokta üst üste kullanamaz. Bu makalede açıklanan yaklaşım, hiyerarşik değerler (bölümler) için ayırıcı olarak çift tireler (--) kullanır. Dizi anahtarları, Azure Key Vault'ta çift tireler ve sayısal anahtar kesimleri (--0--, --1--, ... --{n}--) ile depolanır.

ON JSdosyası tarafından sağlanan aşağıdaki Serilog günlüğü sağlayıcısı yapılandırmasını inceleyin. Dizide WriteTo , günlüğe kaydetme çıkışına yönelik hedefleri açıklayan iki Serilog havuzu yansıtan iki nesne değişmez değeri vardır:

"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=="
      }
    }
  ]
}

Yukarıdaki JSON dosyasında gösterilen yapılandırma, çift tire (--) gösterimi ve sayısal kesimler kullanılarak Azure Key Vault'ta depolanır:

Anahtar Değer
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==

Gizli dizileri yeniden yükleme

Gizli diziler çağrılana kadar IConfigurationRoot.Reload önbelleğe alınır. Daha sonra kasada devre dışı bırakılan veya güncelleştirilen gizli diziler yürütülene kadar Reload uygulama tarafından dikkate alınmıyor.

Configuration.Reload();

Devre dışı bırakılmış ve süresi dolmuş gizli diziler

Süresi dolan gizli diziler varsayılan olarak yapılandırma sağlayıcısına eklenir. Uygulama yapılandırmasında bu gizli dizilerin değerlerini dışlamak için süresi dolan gizli diziyi güncelleştirin veya özel bir yapılandırma sağlayıcısı kullanarak yapılandırmayı sağlayın:

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

Bu özel öğeyi KeyVaultSecretManager ' ye geçirin AddAzureKeyVault:

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

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

Devre dışı bırakılan gizli diziler Key Vault'tan alınamaz ve hiçbir zaman dahil edilemez.

Sorun giderme

Uygulama sağlayıcıyı kullanarak yapılandırmayı yükleyemezse ASP.NET Çekirdek Günlüğü altyapısına bir hata iletisi yazılır. Aşağıdaki koşullar yapılandırmanın yüklenmesini engeller:

  • Uygulama veya sertifika Azure AD'de doğru yapılandırılmamış.
  • Kasa Azure Key Vault'ta mevcut değildir.
  • Uygulamanın kasaya erişme yetkisi yoktur.
  • Erişim ilkesi ve List izinlerini içermezGet.
  • Kasada yapılandırma verileri (ad-değer çifti) yanlış adlandırılmış, eksik veya devre dışı bırakılmış.
  • Uygulama yanlış Key Vault adına (KeyVaultName), Azure AD Uygulama Kimliğine (AzureADApplicationId) veya Azure AD sertifika parmak izine (AzureADCertThumbprint) veya Azure AD Dizin Kimliğine ( )AzureADDirectoryId sahip.
  • Uygulama için Key Vault erişim ilkesi eklenirken ilke oluşturuldu, ancak Erişim ilkeleri kullanıcı arabiriminde Kaydet düğmesi seçilmedi.

Ek kaynaklar