Zprostředkovatel konfigurace služby Azure Key Vault v ASP.NET Core

Tento článek vysvětluje, jak pomocí zprostředkovatele konfigurace služby Azure Key Vault načíst hodnoty konfigurace aplikace z tajných kódů služby Azure Key Vault. Azure Key Vault je cloudová služba, která pomáhá chránit kryptografické klíče a tajné kódy používané aplikacemi a službami. Mezi běžné scénáře použití služby Azure Key Vault s aplikacemi ASP.NET Core patří:

  • Řízení přístupu k citlivým konfiguračním datům
  • Při ukládání konfiguračních dat splňuje požadavek na ověření modulů hardwarového zabezpečení (HSM) pro FIPS 140-2 Level 2.

Packages

Přidejte odkazy na balíčky pro následující balíčky:

Ukázková aplikace

Ukázková aplikace se spouští v některém ze dvou režimů určených direktivou #define preprocesoru v horní části Program.cs:

  • Certificate: Ukazuje použití ID klienta služby Azure Key Vault a certifikátu X.509 pro přístup k tajným kódům uloženým ve službě Azure Key Vault. Tuto ukázku je možné spustit z libovolného umístění bez ohledu na to, jestli se nasadí do služby Aplikace Azure Service nebo z libovolného hostitele, který může obsluhovat aplikaci ASP.NET Core.
  • Managed: Ukazuje, jak používat spravované identity pro prostředky Azure. Spravovaná identita ověřuje aplikaci ve službě Azure Key Vault pomocí spravovaných identit pro prostředky Azure bez uložení přihlašovacích údajů v kódu nebo konfiguraci aplikace. Verze Managed vzorku musí být nasazena na Azure. Postupujte podle pokynů v části Použití spravovaných identit pro prostředky Azure.

Další informace o konfiguraci ukázkové aplikace pomocí direktiv preprocesoru (#define) najdete v tématu Přehled ASP.NET Core.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Úložiště tajných dat v Development prostředí

Místní nastavení tajných kódů pomocí Správce tajných kódů Když ukázková aplikace běží na místním počítači v Development prostředí, tajné kódy se načtou z místního úložiště tajných kódů uživatelů.

Správce tajných kódů vyžaduje <UserSecretsId> vlastnost v souboru projektu aplikace. Nastavte hodnotu vlastnosti ({GUID}) na libovolný jedinečný identifikátor GUID:

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

Tajné kódy se vytvářejí jako páry název-hodnota. Hierarchické hodnoty (oddíly konfigurace) používají : (dvojtečku) jako oddělovač v názvech konfiguračních klíčů ASP.NET Core.

Správce tajemství se používá z příkazového řádku otevřeného v kořenovém adresáři obsahu projektu, kde {SECRET NAME} je jméno a {SECRET VALUE} je hodnota:

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

Spuštěním následujících příkazů v příkazovém prostředí z kořenového adresáře obsahu projektu nastavte tajné kódy pro ukázkovou aplikaci:

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

Pokud jsou tato tajemství uložená ve službě Azure Key Vault v úložišti tajemství v Production prostředí s Azure Key Vault, přípona _dev se změní na _prod. Přípona poskytuje vizuální upozornění ve výstupu aplikace označující zdroj hodnot konfigurace.

Správa tajných informací v prostředí Production pomocí služby Azure Key Vault

Pomocí následujících kroků vytvořte službu Azure Key Vault a uložte do ní tajné kódy ukázkové aplikace. Další informace najdete v tématu Rychlý start: Nastavení a načtení tajného kódu ze služby Azure Key Vault pomocí Azure CLI.

  1. Otevřete Azure Cloud Shell pomocí některé z následujících metod na webu Azure Portal:

    • Zvolte Vyzkoušet v pravém horním rohu bloku kódu. V textovém poli použijte hledaný řetězec Azure CLI.
    • V prohlížeči otevřete Cloud Shell pomocí tlačítka Spustit Cloud Shell .
    • V nabídce v pravém horním rohu webu Azure Portal vyberte tlačítko Cloud Shell.

    Další informace najdete v tématu Azure CLI a přehled služby Azure Cloud Shell.

  2. Pokud ještě nejste ověřeni, přihlaste se pomocí az login příkazu.

  3. Vytvořte skupinu prostředků pomocí následujícího příkazu, kde {RESOURCE GROUP NAME} je název nové skupiny prostředků a {LOCATION} oblast Azure:

    az group create --name "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  4. Ve skupině prostředků vytvořte službu Key Vault pomocí následujícího příkazu, kde {KEY VAULT NAME} je název nového trezoru a {LOCATION} oblast Azure:

    az keyvault create --name {KEY VAULT NAME} --resource-group "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  5. Vytvořte v trezoru tajné kódy jako páry název-hodnota.

    Názvy tajných kódů služby Azure Key Vault jsou omezené na alfanumerické znaky a pomlčky. Hierarchické hodnoty (oddíly konfigurace) používají -- (dvě pomlčky) jako oddělovač, protože dvojtečky nejsou povolené v názvech tajných kódů služby Key Vault. Dvojtečky oddělují oddíl od podklíče v konfiguraci ASP.NET Core. Dvoumlčka se nahradí dvojtečkou, když se tajné kódy načtou do konfigurace aplikace.

    Následující tajné kódy se používají s ukázkovou aplikací. Tyto hodnoty obsahují příponu _prod , která je odlišuje od _dev hodnot přípon načtených v Development prostředí od Secret Manageru. Nahraďte {KEY VAULT NAME} názvem služby Key Vault, který jste vytvořili v předchozím kroku:

    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"
    

Použití ID aplikace a certifikátu X.509 pro aplikace hostované mimo Azure

Nakonfigurujte Službu Azure Key Vault a aplikaci tak, aby používaly id aplikace Microsoft Entra ID a certifikát X.509 k ověření v trezoru , když je aplikace hostovaná mimo Azure. Další informace najdete v tématu O klíčích, tajných klíčích a certifikátech.

Note

I když je použití ID aplikace a certifikátu X.509 podporované pro aplikace hostované v Azure, nedoporučuje se. Místo toho při hostování aplikace v Azure používejte spravované identity pro prostředky Azure. Spravované identity nevyžadují uložení certifikátu v aplikaci nebo v Development prostředí.

Ukázková aplikace používá ID aplikace a certifikát X.509, když je direktiva preprocesoru #define nastavená v horní části Program.cs na Certificate.

  1. Vytvořte archivní certifikát PKCS#12 (.pfx). Možnosti vytváření certifikátů zahrnují New-SelfSignedCertificate ve Windows a OpenSSL.
  2. Nainstalujte certifikát do osobního úložiště certifikátů aktuálního uživatele. Označení klíče jako exportovatelného je volitelné. Poznamenejte si kryptografický otisk certifikátu, který se používá později v tomto procesu.
  3. Exportujte certifikát z archivu PKCS#12 (.pfx) jako certifikát s kódováním DER (.cer).
  4. Zaregistrujte aplikaci pomocí Microsoft Entra ID (Registrace aplikací).
  5. Nahrajte certifikát s kódováním DER (.cer) do MICROSOFT Entra ID:
    1. Vyberte aplikaci v Microsoft Entra ID.
    2. Přejděte na Certifikáty a tajné kódy.
    3. Vyberte Nahrát certifikát a nahrajte certifikát, který obsahuje veřejný klíč. Certifikát .cer, .pem nebo .crt je přijatelný.
  6. Do souboru aplikace appsettings.json uložte název služby Key Vault, ID aplikace a kryptografický otisk certifikátu.
  7. Na webu Azure Portal přejděte ke službě Key Vault.
  8. Vyberte trezor klíčů, který jste vytvořili v sekci úložiště tajných kódů v Production prostředí s Azure Key Vault.
  9. Vyberte Zásady přístupu.
  10. Vyberte Přidat zásady přístupu.
  11. Otevřete oprávnění tajného klíče a poskytněte aplikaci oprávnění Získat a Seznam.
  12. Vyberte hlavní objekt a vyberte zaregistrovanou aplikaci podle názvu. Zvolte tlačítko Vybrat.
  13. Vyberte OK.
  14. Vyberte Uložit.
  15. Nasaďte aplikaci.

Ukázková Certificate aplikace získává své konfigurační hodnoty z IConfigurationRoot, která má stejný název jako tajný kód.

  • Ne hierarchické hodnoty: Hodnota pro SecretName je získána pomocí config["SecretName"].
  • Hierarchické hodnoty (oddíly): Použijte : (dvojtečka) notaci nebo metodu GetSection . K získání hodnoty konfigurace použijte některý z těchto přístupů:
    • config["Section:SecretName"]
    • config.GetSection("Section")["SecretName"]

Certifikát X.509 spravuje operační systém. Aplikace volá AddAzureKeyVault s hodnotami zadanými souborem appsettings.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();

Ukázkové hodnoty:

  • Název služby Key Vault: contosovault
  • ID aplikace: 00001111-aaaa-2222-bbbb-3333cccc4444
  • Kryptografický otisk certifikátu: fe14593dd66b2406c5269d742d04b6e1ab03adb1

appsettings.json:

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

Při spuštění aplikace se na webové stránce zobrazí načtené tajné hodnoty. V prostředí Development se tajné hodnoty načítají s příponou _dev. Production V prostředí se hodnoty načítají s příponou_prod.

Použití spravovaných identit pro prostředky Azure

Aplikace nasazená do Azure může využívat spravované identity pro prostředky Azure. Spravovaná identita umožňuje aplikaci ověřovat se službou Azure Key Vault pomocí ověřování Microsoft Entra ID bez uložení přihlašovacích údajů v kódu nebo konfiguraci aplikace.

Ukázková aplikace používá systémem přiřazenou spravovanou identitu, když je direktiva preprocesoru #define na začátku nastavena na Program.cs. Pokud chcete vytvořit spravovanou identitu pro aplikaci Azure App Service, přečtěte si téma Použití spravovaných identit pro App Service a Azure Functions. Po vytvoření spravované identity si poznamenejte ID objektu aplikace zobrazené na webu Azure Portal na Identity panelu služby App Service.

Do souboru aplikace zadejte název trezoru appsettings.json . Ukázková aplikace nevyžaduje ID aplikace a heslo (tajný klíč klienta) při nastavení verze Managed , takže tyto položky konfigurace můžete ignorovat. Aplikace se nasadí do Azure a Azure ji ověří pro přístup ke službě Azure Key Vault jenom pomocí názvu trezoru uloženého appsettings.json v souboru.

Nasaďte ukázkovou aplikaci do služby Aplikace Azure Service.

Pomocí Azure CLI a ID objektu aplikace udělte aplikaci oprávnění list a get pro přístup k trezoru.

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

Restartujte aplikaci pomocí Azure CLI, PowerShellu nebo webu Azure Portal.

Ukázková aplikace vytvoří instanci DefaultAzureCredential třídy. Přihlašovací údaje se pokusí získat přístupový token z prostředí pro prostředky 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());
}

Note

Předchozí příklad používá DefaultAzureCredential ke zjednodušení ověřování při vývoji aplikací, které se nasazují do Azure zkombinováním přihlašovacích údajů používaných v hostitelských prostředích Azure s přihlašovacími údaji použitými v místním vývoji. Při přechodu na produkci je lepší volbou alternativa, například ManagedIdentityCredential. Další informace najdete v tématu Ověřování aplikací .NET hostovaných v Azure v prostředcích Azure pomocí spravované identity přiřazené systémem.

Příklad hodnoty názvu služby Key Vault: contosovault

appsettings.json:

{
  "KeyVaultName": "Key Vault Name"
}

U aplikací, které používají spravovanou identitu přiřazenou uživatelem, nakonfigurujte ID klienta spravované identity pomocí jednoho z následujících přístupů:

  1. Nastavte proměnnou prostředí AZURE_CLIENT_ID.

  2. Nastavte vlastnost DefaultAzureCredentialOptions.ManagedIdentityClientId při volání AddAzureKeyVault.

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

Při spuštění aplikace se na webové stránce zobrazí načtené tajné hodnoty. V prostředí Development mají tajné hodnoty příponu _dev, protože je poskytuje Správce tajemství. V prostředí Production se hodnoty načítají s příponou _prod, protože jsou poskytovány službou Azure Key Vault.

Pokud se zobrazí Access denied chyba, ověřte, že je aplikace zaregistrovaná pomocí ID Microsoft Entra a že poskytuje přístup k trezoru. Potvrďte, že jste službu restartovali v Azure.

Informace o použití zprostředkovatele se spravovanou identitou a Službou Azure Pipelines najdete v tématu Vytvoření připojení služby Azure Resource Manager k virtuálnímu počítači s identitou spravované služby.

Možnosti konfigurace

AddAzureKeyVault může přijmout AzureKeyVaultConfigurationOptions objekt:

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

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

Objekt AzureKeyVaultConfigurationOptions obsahuje následující vlastnosti:

Property Description
Manager KeyVaultSecretManager instance použitá k řízení načítání tajných dat.
ReloadInterval TimeSpan počkat mezi pokusy o dotazování úložiště na změny. Výchozí hodnota je null (konfigurace se znovu nenačte).

Použití předpony názvu klíče

AddAzureKeyVault poskytuje přetížení, které přijímá implementaci KeyVaultSecretManager, což umožňuje řídit, jak se tajné kódy Key Vault převádějí na konfigurační klíče. Můžete například implementovat rozhraní pro načtení tajných hodnot na základě hodnoty předpony, kterou zadáte při spuštění aplikace. Tato technika vám například umožňuje načíst tajné kódy na základě verze aplikace.

Warning

Nepoužívejte předpony u tajných kódů služby Key Vault k:

  • Tajné kódy pro více aplikací umístěte do stejného trezoru.
  • Umístěte tajemství prostředí (například vývoj versus produkční tajemství) do stejného trezoru.

Různé aplikace a vývojová/produkční prostředí by měly používat samostatné trezory klíčů k izolaci aplikačních prostředí pro nejvyšší úroveň zabezpečení.

V následujícím příkladu se tajný klíč vytvoří ve službě Key Vault (a pomocí Správce tajných kódů pro Development prostředí) pro 5000-AppSecret (období nejsou povolená v názvech tajných kódů služby Key Vault). Tento tajný kód představuje tajný kód aplikace pro verzi 5.0.0.0 aplikace. Pro jinou verzi aplikace 5.1.0.0 se do trezoru (a pomocí Správce tajných kódů) přidá tajný kód pro 5100-AppSecret. Každá verze aplikace načte svou verzovanou tajnou hodnotu do své konfigurace jako AppSecret, přičemž při načítání tajné hodnoty je verze odstraněna.

AddAzureKeyVault se volá s vlastní KeyVaultSecretManager implementací:

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

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

Implementace reaguje na předpony verzí tajných kódů za účelem načtení správného tajného kódu do konfigurace:

  • Load načte tajný kód, když jeho název začíná předponou. Jiné tajné kódy se nenačtou.
  • GetKey:
    • Odebere předponu z tajného názvu.
    • Nahradí dvě pomlčky v libovolném názvu znakem KeyDelimiter, což je oddělovač použitý v konfiguraci (obvykle dvojtečka). Azure Key Vault neumožňuje dvojtečku v názvech tajných kódů.
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);
}

Metoda Load je volána algoritmem zprostředkovatele, který iteruje prostřednictvím tajných kódů trezoru a vyhledá tajné kódy s předponou verze. Pokud je nalezena Load předpona verze, algoritmus používá GetKey metodu k vrácení názvu konfigurace tajného názvu. Odebere předponu verze z názvu tajného kódu. Zbytek tajného názvu se vrátí pro načtení do párů název-hodnota v konfiguraci aplikace.

Při implementaci tohoto přístupu:

  1. Verze aplikace zadaná v souboru projektu aplikace. V následujícím příkladu je verze aplikace nastavená na 5.0.0.0:

    <PropertyGroup>
      <Version>5.0.0.0</Version>
    </PropertyGroup>
    
  2. Ověřte, že <UserSecretsId> se vlastnost nachází v souboru projektu aplikace, kde {GUID} je identifikátor GUID zadaný uživatelem:

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

    Pomocí Správce tajných kódů uložte následující tajné kódy místně:

    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. Tajné kódy se ukládají ve službě Azure Key Vault pomocí následujících příkazů Azure CLI:

    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. Při spuštění aplikace se načtou tajné kódy služby Key Vault. Tajný řetězec 5000-AppSecret odpovídá verzi aplikace uvedené v projektovém souboru aplikace (5.0.0.0).

  5. Verze 5000 s pomlčkou je odebrána ze jména klíče. V celé aplikaci se při čtení konfigurace s klíčem načte hodnota tajného klíče AppSecret .

  6. Pokud se verze aplikace v souboru projektu změní na 5.1.0.0 a aplikace se znovu spustí, vrátí se tajná hodnota 5.1.0.0_secret_value_dev v prostředí Development a 5.1.0.0_secret_value_prod v Production.

Note

Můžete také poskytnout vlastní SecretClient implementaci pro AddAzureKeyVault. Vlastní klient umožňuje sdílet jednu instanci klienta v rámci aplikace.

Propojte pole s třídou

Zprostředkovatel může číst konfigurační hodnoty do pole pro vazbu k poli POCO.

Při čtení ze zdroje konfigurace, který umožňuje klíčům obsahovat oddělovače dvojtečky (:) je použit číselný segment klíče k rozlišení klíčů, které tvoří pole (:0:, :1:... :{n}:). Další informace naleznete v tématu Konfigurace: Vytvoření vazby pole ke třídě.

Klíče služby Azure Key Vault nemůžou jako oddělovač používat dvojtečku. Přístup popsaný v tomto článku používá dvojité pomlčky (--) jako oddělovač pro hierarchické hodnoty (oddíly). Klíče pole jsou uloženy ve službě Azure Key Vault s dvojitými pomlčkami a číselnými segmenty klíčů (--0--, ... --1----{n}--).

Prozkoumejte následující konfiguraci zprostředkovatele protokolování Serilog , kterou poskytuje soubor JSON. V poli jsou definovány WriteTo dva literály objektů, které odrážejí dvě jímky Serilog, které popisují cíle pro protokolování výstupu:

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

Konfigurace zobrazená v předchozím souboru JSON je uložena ve službě Azure Key Vault pomocí notace s dvěma pomlčkami (--) a číselných segmentů.

Key Value
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==

Opětovné načtení tajných kódů

Ve výchozím nastavení jsou tajné kódy uložené v mezipaměti poskytovatelem konfigurace po celou dobu života aplikace. Tajemství, která byla následně zakázána nebo aktualizována v trezoru, jsou aplikací ignorována.

Pokud chcete znovu načíst tajné kódy, zavolejte IConfigurationRoot.Reload:

config.Reload();

Chcete-li pravidelně znovu načítat secrety, nastavte vlastnost AzureKeyVaultConfigurationOptions.ReloadInterval v zadaném intervalu. Další informace naleznete v tématu Možnosti konfigurace.

Zakázané a prošlé tajné kódy

Tajné kódy s vypršenou platností jsou ve výchozím nastavení součástí zprostředkovatele konfigurace. Pokud chcete vyloučit hodnoty těchto tajných kódů v konfiguraci aplikace, aktualizujte tajný klíč s vypršenou platností nebo zadejte konfiguraci pomocí vlastního zprostředkovatele konfigurace:

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

Předejte tento vlastní prvek KeyVaultSecretManager do AddAzureKeyVault:

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

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

Zakázané tajné kódy nelze načíst ze služby Key Vault a nikdy se nezahrnou.

Note

Předchozí příklad používá DefaultAzureCredential ke zjednodušení ověřování při vývoji aplikací, které se nasazují do Azure zkombinováním přihlašovacích údajů používaných v hostitelských prostředích Azure s přihlašovacími údaji použitými v místním vývoji. Při přechodu na produkci je lepší volbou alternativa, například ManagedIdentityCredential. Další informace najdete v tématu Ověřování aplikací .NET hostovaných v Azure v prostředcích Azure pomocí spravované identity přiřazené systémem.

Troubleshoot

Pokud se aplikaci nepodaří načíst konfiguraci pomocí zprostředkovatele, zapíše se chybová zpráva do infrastruktury protokolování jádra ASP.NET. Následující podmínky zabrání načtení konfigurace:

  • Aplikace nebo certifikát nejsou správně nakonfigurované v ID Microsoft Entra.
  • Trezor ve službě Azure Key Vault neexistuje.
  • Aplikace nemá oprávnění pro přístup k trezoru.
  • Zásady přístupu nezahrnují Get a List oprávnění.
  • V trezoru jsou konfigurační data (pár název-hodnota) nesprávně pojmenována, chybí nebo deaktivována.
  • Aplikace má nesprávný název služby Key Vault (KeyVaultName), ID aplikace Microsoft Entra ID (AzureADApplicationId) nebo kryptografický otisk certifikátu Microsoft Entra ID (AzureADCertThumbprint) nebo ID adresáře Microsoft Entra ID (AzureADDirectoryId).
  • Při přidávání zásad přístupu ke službě Key Vault pro aplikaci se zásady vytvořily, ale v uživatelském rozhraní zásad přístupu nebylo vybráno tlačítko Uložit.

Dodatečné zdroje

Tento článek vysvětluje, jak pomocí zprostředkovatele konfigurace služby Azure Key Vault načíst hodnoty konfigurace aplikace z tajných kódů služby Azure Key Vault. Azure Key Vault je cloudová služba, která pomáhá chránit kryptografické klíče a tajné kódy používané aplikacemi a službami. Mezi běžné scénáře použití služby Azure Key Vault s aplikacemi ASP.NET Core patří:

  • Řízení přístupu k citlivým konfiguračním datům
  • Při ukládání konfiguračních dat splňuje požadavek na ověření modulů hardwarového zabezpečení (HSM) pro FIPS 140-2 Level 2.

Packages

Přidejte odkazy na balíčky pro následující balíčky:

Ukázková aplikace

Ukázková aplikace se spouští v některém ze dvou režimů určených direktivou #define preprocesoru v horní části Program.cs:

  • Certificate: Ukazuje použití ID klienta služby Azure Key Vault a certifikátu X.509 pro přístup k tajným kódům uloženým ve službě Azure Key Vault. Tuto ukázku je možné spustit z libovolného umístění bez ohledu na to, jestli se nasadí do služby Aplikace Azure Service nebo z libovolného hostitele, který může obsluhovat aplikaci ASP.NET Core.
  • Managed: Ukazuje, jak používat spravované identity pro prostředky Azure. Spravovaná identita ověřuje aplikaci ve službě Azure Key Vault pomocí spravovaných identit pro prostředky Azure bez přihlašovacích údajů uložených v kódu nebo konfiguraci aplikace. Při použití spravovaných identit pro ověřování se nevyžadují ID aplikace spravovaných identit pro prostředky Azure ani heslo (tajný klíč klienta). Verze Managed vzorku musí být nasazena na Azure. Postupujte podle pokynů v části Použití spravovaných identit pro prostředky Azure.

Další informace o konfiguraci ukázkové aplikace pomocí direktiv preprocesoru (#define) najdete v tématu Přehled ASP.NET Core.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Úložiště tajných dat v Development prostředí

Místní nastavení tajných kódů pomocí Správce tajných kódů Když ukázková aplikace běží na místním počítači v Development prostředí, tajné kódy se načtou z místního úložiště tajných kódů uživatelů.

Správce tajných kódů vyžaduje <UserSecretsId> vlastnost v souboru projektu aplikace. Nastavte hodnotu vlastnosti ({GUID}) na libovolný jedinečný identifikátor GUID:

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

Tajné kódy se vytvářejí jako páry název-hodnota. Hierarchické hodnoty (oddíly konfigurace) používají : (dvojtečku) jako oddělovač v názvech konfiguračních klíčů ASP.NET Core.

Správce tajemství se používá z příkazového řádku otevřeného v kořenovém adresáři obsahu projektu, kde {SECRET NAME} je jméno a {SECRET VALUE} je hodnota:

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

Spuštěním následujících příkazů v příkazovém prostředí z kořenového adresáře obsahu projektu nastavte tajné kódy pro ukázkovou aplikaci:

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

Pokud jsou tato tajemství uložená ve službě Azure Key Vault v úložišti tajemství v Production prostředí s Azure Key Vault, přípona _dev se změní na _prod. Přípona poskytuje vizuální upozornění ve výstupu aplikace označující zdroj hodnot konfigurace.

Správa tajných informací v prostředí Production pomocí služby Azure Key Vault

Pomocí následujících kroků vytvořte službu Azure Key Vault a uložte do ní tajné kódy ukázkové aplikace. Další informace najdete v tématu Rychlý start: Nastavení a načtení tajného kódu ze služby Azure Key Vault pomocí Azure CLI.

  1. Otevřete Azure Cloud Shell pomocí některé z následujících metod na webu Azure Portal:

    • Zvolte Vyzkoušet v pravém horním rohu bloku kódu. V textovém poli použijte hledaný řetězec Azure CLI.
    • V prohlížeči otevřete Cloud Shell pomocí tlačítka Spustit Cloud Shell .
    • V nabídce v pravém horním rohu webu Azure Portal vyberte tlačítko Cloud Shell.

    Další informace najdete v tématu Azure CLI a přehled služby Azure Cloud Shell.

  2. Pokud ještě nejste ověřeni, přihlaste se pomocí az login příkazu.

  3. Vytvořte skupinu prostředků pomocí následujícího příkazu, kde {RESOURCE GROUP NAME} je název nové skupiny prostředků a {LOCATION} oblast Azure:

    az group create --name "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  4. Ve skupině prostředků vytvořte službu Key Vault pomocí následujícího příkazu, kde {KEY VAULT NAME} je název nového trezoru a {LOCATION} oblast Azure:

    az keyvault create --name {KEY VAULT NAME} --resource-group "{RESOURCE GROUP NAME}" --location {LOCATION}
    
  5. Vytvořte v trezoru tajné kódy jako páry název-hodnota.

    Názvy tajných kódů služby Azure Key Vault jsou omezené na alfanumerické znaky a pomlčky. Hierarchické hodnoty (oddíly konfigurace) používají -- (dvě pomlčky) jako oddělovač, protože dvojtečky nejsou povolené v názvech tajných kódů služby Key Vault. Dvojtečky oddělují oddíl od podklíče v konfiguraci ASP.NET Core. Dvoumlčka se nahradí dvojtečkou, když se tajné kódy načtou do konfigurace aplikace.

    Následující tajné kódy se používají s ukázkovou aplikací. Tyto hodnoty obsahují příponu _prod , která je odlišuje od _dev hodnot přípon načtených v Development prostředí od Secret Manageru. Nahraďte {KEY VAULT NAME} názvem služby Key Vault, který jste vytvořili v předchozím kroku:

    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"
    

Použití ID aplikace a certifikátu X.509 pro aplikace hostované mimo Azure

Nakonfigurujte Službu Azure Key Vault a aplikaci tak, aby používaly id aplikace Microsoft Entra ID a certifikát X.509 k ověření v trezoru , když je aplikace hostovaná mimo Azure. Další informace najdete v tématu O klíčích, tajných klíčích a certifikátech.

Note

I když je použití ID aplikace a certifikátu X.509 podporované pro aplikace hostované v Azure, nedoporučuje se. Místo toho při hostování aplikace v Azure používejte spravované identity pro prostředky Azure. Spravované identity nevyžadují uložení certifikátu v aplikaci nebo v Development prostředí.

Ukázková aplikace používá ID aplikace a certifikát X.509, když je direktiva preprocesoru #define nastavená v horní části Program.cs na Certificate.

  1. Vytvořte archivní certifikát PKCS#12 (.pfx). Možnosti vytváření certifikátů zahrnují New-SelfSignedCertificate ve Windows a OpenSSL.
  2. Nainstalujte certifikát do osobního úložiště certifikátů aktuálního uživatele. Označení klíče jako exportovatelného je volitelné. Poznamenejte si kryptografický otisk certifikátu, který se používá později v tomto procesu.
  3. Exportujte certifikát z archivu PKCS#12 (.pfx) jako certifikát s kódováním DER (.cer).
  4. Zaregistrujte aplikaci pomocí Microsoft Entra ID (Registrace aplikací).
  5. Nahrajte certifikát s kódováním DER (.cer) do MICROSOFT Entra ID:
    1. Vyberte aplikaci v Microsoft Entra ID.
    2. Přejděte na Certifikáty a tajné kódy.
    3. Vyberte Nahrát certifikát a nahrajte certifikát, který obsahuje veřejný klíč. Certifikát .cer, .pem nebo .crt je přijatelný.
  6. Do souboru aplikace appsettings.json uložte název služby Key Vault, ID aplikace a kryptografický otisk certifikátu.
  7. Na webu Azure Portal přejděte ke službě Key Vault.
  8. Vyberte trezor klíčů, který jste vytvořili v sekci úložiště tajných kódů v Production prostředí s Azure Key Vault.
  9. Vyberte Zásady přístupu.
  10. Vyberte Přidat zásady přístupu.
  11. Otevřete oprávnění tajného klíče a poskytněte aplikaci oprávnění Získat a Seznam.
  12. Vyberte hlavní objekt a vyberte zaregistrovanou aplikaci podle názvu. Zvolte tlačítko Vybrat.
  13. Vyberte OK.
  14. Vyberte Uložit.
  15. Nasaďte aplikaci.

Ukázková Certificate aplikace získává své konfigurační hodnoty z IConfigurationRoot, která má stejný název jako tajný kód.

  • Ne hierarchické hodnoty: Hodnota pro SecretName je získána pomocí config["SecretName"].
  • Hierarchické hodnoty (oddíly): Použijte : (dvojtečka) notaci nebo metodu GetSection . K získání hodnoty konfigurace použijte některý z těchto přístupů:
    • config["Section:SecretName"]
    • config.GetSection("Section")["SecretName"]

Certifikát X.509 spravuje operační systém. Aplikace volá AddAzureKeyVault s hodnotami zadanými souborem appsettings.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>());

Ukázkové hodnoty:

  • Název služby Key Vault: contosovault
  • ID aplikace: 00001111-aaaa-2222-bbbb-3333cccc4444
  • Kryptografický otisk certifikátu: fe14593dd66b2406c5269d742d04b6e1ab03adb1

appsettings.json:

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

Při spuštění aplikace se na webové stránce zobrazí načtené tajné hodnoty. V prostředí Development se tajné hodnoty načítají s příponou _dev. Production V prostředí se hodnoty načítají s příponou_prod.

Použití spravovaných identit pro prostředky Azure

Aplikace nasazená do Azure může využívat spravované identity pro prostředky Azure. Spravovaná identita umožňuje aplikaci ověřovat se službou Azure Key Vault pomocí ověřování Microsoft Entra ID bez přihlašovacích údajů (ID aplikace a hesla nebo tajného klíče klienta) uložených v aplikaci.

Ukázková aplikace používá spravované identity pro prostředky Azure, když je direktiva preprocesoru #define na začátku Program.csnastavena na Managed.

Do souboru aplikace zadejte název trezoru appsettings.json . Ukázková aplikace nevyžaduje ID aplikace a heslo (tajný klíč klienta) při nastavení verze Managed , takže tyto položky konfigurace můžete ignorovat. Aplikace se nasadí do Azure a Azure ji ověří pro přístup ke službě Azure Key Vault jenom pomocí názvu trezoru uloženého appsettings.json v souboru.

Nasaďte ukázkovou aplikaci do služby Aplikace Azure Service.

Aplikace nasazená do služby Aplikace Azure Service se při vytvoření služby automaticky zaregistruje s ID Microsoft Entra. Získejte ID objektu z nasazení pro použití v následujícím příkazu. ID objektu se zobrazuje na webu Azure Portal na Identity panelu služby App Service.

Pomocí Azure CLI a ID objektu aplikace udělte aplikaci oprávnění list a get pro přístup k trezoru.

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

Restartujte aplikaci pomocí Azure CLI, PowerShellu nebo webu Azure Portal.

Ukázková aplikace:

  • Vytvoří instanci objektu DefaultAzureCredential třídy. Přihlašovací údaje se pokusí získat přístupový token z prostředí pro prostředky Azure.
  • Nový SecretClient je vytvořen s instancí DefaultAzureCredential.
  • Instance SecretClient se používá s KeyVaultSecretManager instancí, která načte tajné hodnoty a nahrazuje dvojité pomlčky (--) dvojtečkami (:) v názvech klíčů.
// 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>());

Note

Předchozí příklad používá DefaultAzureCredential ke zjednodušení ověřování při vývoji aplikací, které se nasazují do Azure zkombinováním přihlašovacích údajů používaných v hostitelských prostředích Azure s přihlašovacími údaji použitými v místním vývoji. Při přechodu na produkci je lepší volbou alternativa, například ManagedIdentityCredential. Další informace najdete v tématu Ověřování aplikací .NET hostovaných v Azure v prostředcích Azure pomocí spravované identity přiřazené systémem.

Příklad hodnoty názvu služby Key Vault: contosovault

appsettings.json:

{
  "KeyVaultName": "Key Vault Name"
}

Při spuštění aplikace se na webové stránce zobrazí načtené tajné hodnoty. V prostředí Development mají tajné hodnoty příponu _dev, protože je poskytuje Správce tajemství. V prostředí Production se hodnoty načítají s příponou _prod, protože jsou poskytovány službou Azure Key Vault.

Pokud se zobrazí Access denied chyba, ověřte, že je aplikace zaregistrovaná pomocí ID Microsoft Entra a že poskytuje přístup k trezoru. Potvrďte, že jste službu restartovali v Azure.

Informace o použití zprostředkovatele se spravovanou identitou a Službou Azure Pipelines najdete v tématu Vytvoření připojení služby Azure Resource Manager k virtuálnímu počítači s identitou spravované služby.

Možnosti konfigurace

AddAzureKeyVault může přijmout AzureKeyVaultConfigurationOptions objekt:

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

Note

Předchozí příklad používá DefaultAzureCredential ke zjednodušení ověřování při vývoji aplikací, které se nasazují do Azure zkombinováním přihlašovacích údajů používaných v hostitelských prostředích Azure s přihlašovacími údaji použitými v místním vývoji. Při přechodu na produkci je lepší volbou alternativa, například ManagedIdentityCredential. Další informace najdete v tématu Ověřování aplikací .NET hostovaných v Azure v prostředcích Azure pomocí spravované identity přiřazené systémem.

Objekt AzureKeyVaultConfigurationOptions obsahuje následující vlastnosti.

Property Description
Manager KeyVaultSecretManager instance použitá k řízení načítání tajných dat.
ReloadInterval TimeSpan počkat mezi pokusy o dotazování úložiště na změny. Výchozí hodnota je null (konfigurace se znovu nenačte).

Použití předpony názvu klíče

AddAzureKeyVault poskytuje přetížení, které přijímá implementaci KeyVaultSecretManager, což umožňuje řídit, jak se tajné kódy Key Vault převádějí na konfigurační klíče. Můžete například implementovat rozhraní pro načtení tajných hodnot na základě hodnoty předpony, kterou zadáte při spuštění aplikace. Tato technika vám například umožňuje načíst tajné kódy na základě verze aplikace.

Warning

Nepoužívejte předpony u tajných kódů služby Key Vault k:

  • Tajné kódy pro více aplikací umístěte do stejného trezoru.
  • Umístěte tajemství prostředí (například vývoj versus produkční tajemství) do stejného trezoru.

Různé aplikace a vývojová/produkční prostředí by měly používat samostatné trezory klíčů k izolaci aplikačních prostředí pro nejvyšší úroveň zabezpečení.

V následujícím příkladu se tajný klíč vytvoří ve službě Key Vault (a pomocí Správce tajných kódů pro Development prostředí) pro 5000-AppSecret (období nejsou povolená v názvech tajných kódů služby Key Vault). Tento tajný kód představuje tajný kód aplikace pro verzi 5.0.0.0 aplikace. Pro jinou verzi aplikace 5.1.0.0 se do trezoru (a pomocí Správce tajných kódů) přidá tajný kód pro 5100-AppSecret. Každá verze aplikace načte svou verzovanou tajnou hodnotu do své konfigurace jako AppSecret, přičemž při načítání tajné hodnoty je verze odstraněna.

AddAzureKeyVault se volá s vlastní KeyVaultSecretManager implementací:

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

Implementace reaguje na předpony verzí tajných kódů za účelem načtení správného tajného kódu do konfigurace:

  • Load načte tajný kód, když jeho název začíná předponou. Jiné tajné kódy se nenačtou.
  • GetKey:
    • Odebere předponu z tajného názvu.
    • Nahradí dvě pomlčky v libovolném názvu znakem KeyDelimiter, což je oddělovač použitý v konfiguraci (obvykle dvojtečka). Azure Key Vault neumožňuje dvojtečku v názvech tajných kódů.
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);
    }
}

Metoda Load je volána algoritmem zprostředkovatele, který iteruje prostřednictvím tajných kódů trezoru a vyhledá tajné kódy s předponou verze. Pokud je nalezena Load předpona verze, algoritmus používá GetKey metodu k vrácení názvu konfigurace tajného názvu. Odebere předponu verze z názvu tajného kódu. Zbytek tajného názvu se vrátí pro načtení do párů název-hodnota v konfiguraci aplikace.

Při implementaci tohoto přístupu:

  1. Verze aplikace zadaná v souboru projektu aplikace. V následujícím příkladu je verze aplikace nastavená na 5.0.0.0:

    <PropertyGroup>
      <Version>5.0.0.0</Version>
    </PropertyGroup>
    
  2. Ověřte, že <UserSecretsId> se vlastnost nachází v souboru projektu aplikace, kde {GUID} je identifikátor GUID zadaný uživatelem:

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

    Pomocí Správce tajných kódů uložte následující tajné kódy místně:

    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. Tajné kódy se ukládají ve službě Azure Key Vault pomocí následujících příkazů Azure CLI:

    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. Při spuštění aplikace se načtou tajné kódy služby Key Vault. Tajný řetězec 5000-AppSecret odpovídá verzi aplikace uvedené v projektovém souboru aplikace (5.0.0.0).

  5. Verze 5000 s pomlčkou je odebrána ze jména klíče. V celé aplikaci se při čtení konfigurace s klíčem načte hodnota tajného klíče AppSecret .

  6. Pokud se verze aplikace v souboru projektu změní na 5.1.0.0 a aplikace se znovu spustí, vrátí se tajná hodnota 5.1.0.0_secret_value_dev v prostředí Development a 5.1.0.0_secret_value_prod v Production.

Note

Můžete také poskytnout vlastní SecretClient implementaci pro AddAzureKeyVault. Vlastní klient umožňuje sdílet jednu instanci klienta v rámci aplikace.

Propojte pole s třídou

Zprostředkovatel může číst konfigurační hodnoty do pole pro vazbu k poli POCO.

Při čtení ze zdroje konfigurace, který umožňuje klíčům obsahovat oddělovače dvojtečky (:) je použit číselný segment klíče k rozlišení klíčů, které tvoří pole (:0:, :1:... :{n}:). Další informace naleznete v tématu Konfigurace: Vytvoření vazby pole ke třídě.

Klíče služby Azure Key Vault nemůžou jako oddělovač používat dvojtečku. Přístup popsaný v tomto článku používá dvojité pomlčky (--) jako oddělovač pro hierarchické hodnoty (oddíly). Klíče pole jsou uloženy ve službě Azure Key Vault s dvojitými pomlčkami a číselnými segmenty klíčů (--0--, ... --1----{n}--).

Prozkoumejte následující konfiguraci zprostředkovatele protokolování Serilog , kterou poskytuje soubor JSON. V poli jsou definovány WriteTo dva literály objektů, které odrážejí dvě jímky Serilog, které popisují cíle pro protokolování výstupu:

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

Konfigurace zobrazená v předchozím souboru JSON je uložena ve službě Azure Key Vault pomocí notace s dvěma pomlčkami (--) a číselných segmentů.

Key Value
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==

Opětovné načtení tajných kódů

Tajemství se ukládají do mezipaměti, dokud se nezavolá IConfigurationRoot.Reload. Tajné kódy, které jsou následně zakázány nebo aktualizovány v trezoru, aplikace nerespektuje, dokud se nespustí Reload.

Configuration.Reload();

Zakázané a prošlé tajné kódy

Tajné kódy s vypršenou platností jsou ve výchozím nastavení součástí zprostředkovatele konfigurace. Pokud chcete vyloučit hodnoty těchto tajných kódů v konfiguraci aplikace, aktualizujte tajný klíč s vypršenou platností nebo zadejte konfiguraci pomocí vlastního zprostředkovatele konfigurace:

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

Předejte tento vlastní prvek KeyVaultSecretManager do AddAzureKeyVault:

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

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

Zakázané tajné kódy nelze načíst ze služby Key Vault a nikdy se nezahrnou.

Note

Předchozí příklad používá DefaultAzureCredential ke zjednodušení ověřování při vývoji aplikací, které se nasazují do Azure zkombinováním přihlašovacích údajů používaných v hostitelských prostředích Azure s přihlašovacími údaji použitými v místním vývoji. Při přechodu na produkci je lepší volbou alternativa, například ManagedIdentityCredential. Další informace najdete v tématu Ověřování aplikací .NET hostovaných v Azure v prostředcích Azure pomocí spravované identity přiřazené systémem.

Troubleshoot

Pokud se aplikaci nepodaří načíst konfiguraci pomocí zprostředkovatele, zapíše se chybová zpráva do infrastruktury protokolování jádra ASP.NET. Následující podmínky zabrání načtení konfigurace:

  • Aplikace nebo certifikát nejsou správně nakonfigurované v ID Microsoft Entra.
  • Trezor ve službě Azure Key Vault neexistuje.
  • Aplikace nemá oprávnění pro přístup k trezoru.
  • Zásady přístupu nezahrnují Get a List oprávnění.
  • V trezoru jsou konfigurační data (pár název-hodnota) nesprávně pojmenována, chybí nebo deaktivována.
  • Aplikace má nesprávný název služby Key Vault (KeyVaultName), ID aplikace Microsoft Entra ID (AzureADApplicationId) nebo kryptografický otisk certifikátu Microsoft Entra ID (AzureADCertThumbprint) nebo ID adresáře Microsoft Entra ID (AzureADDirectoryId).
  • Při přidávání zásad přístupu ke službě Key Vault pro aplikaci se zásady vytvořily, ale v uživatelském rozhraní zásad přístupu nebylo vybráno tlačítko Uložit.

Dodatečné zdroje