Poskytovatel konfigurace Azure Key Vault v ASP.NET Core

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

  • Řízení přístupu k citlivým datům konfigurace.
  • Splnění požadavku na Standard FIPS 140-2 úrovně 2 HSM (Hardware Security Module) pro ukládání konfiguračních dat.

Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)

Balíčky

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

Ukázková aplikace

Ukázková aplikace běží v jednom ze dvou režimů určených #define direktivou preprocesoru v horní části programu. cs:

  • Certificate: Ukazuje použití ID klienta Azure Key Vault a certifikátu X. 509 pro přístup k tajným klíčům uloženým v Azure Key Vault. tuto ukázku můžete spustit z libovolného umístění, ať už je nasazená do Azure App Service nebo libovolného hostitele, který může sloužit ASP.NET Core aplikace.
  • Managed: Ukazuje, jak používat spravované identity pro prostředky Azure. spravovaná identita ověřuje aplikaci, aby se Azure Key Vault s ověřováním Azure Active Directory (AD) bez přihlašovacích údajů uložených v kódu nebo konfiguraci aplikace. Při ověřování identity pomocí spravovaných identit se nevyžaduje ID a heslo aplikace služby Azure AD (tajný klíč klienta). ManagedVerze ukázky musí být nasazená do 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 ) naleznete v tématu Úvod do ASP.NET Core .

Tajné úložiště ve vývojovém prostředí

Místní nastavení tajných kódů pomocí správce tajnýchklíčů. Když je ukázková aplikace spuštěná na místním počítači ve vývojovém prostředí, načtou se tajné klíče z úložiště tajných klíčů místního uživatele.

Správce tajných klíčů 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 jsou vytvořeny jako páry název-hodnota. hierarchické hodnoty (konfigurační oddíly) používají : jako oddělovač v ASP.NET Core názvů konfiguračních klíčů středník (dvojtečku).

Správce tajného klíče se používá z příkazového prostředí otevřeného v kořenovém adresáři obsahuprojektu, kde {SECRET NAME} je název a {SECRET VALUE} je hodnota:

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

Spusťte následující příkazy v příkazovém prostředí z kořenu obsahu projektu pro nastavení tajných kódů 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 tyto tajné klíče uložené v Azure Key Vault v tajném úložišti v produkčním prostředí s Azure Key Vault oddílu, _dev přípona se změní na _prod . Přípona poskytuje vizuální hromádku ve výstupu aplikace, která označuje zdroj hodnot konfigurace.

Tajné úložiště v produkčním prostředí pomocí Azure Key Vault

Provedením následujících kroků vytvořte Azure Key Vault a uložte si do něj tajné klíče ukázkové aplikace. Další informace najdete v tématu rychlý Start: nastavení a načtení tajného klíče z Azure Key Vault pomocí Azure CLI.

  1. Otevřete Azure Cloud Shell pomocí některé z následujících metod v 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".
    • Otevřete Cloud Shell v prohlížeči pomocí tlačítka pro spuštění Cloud Shell .
    • V nabídce v pravém horním rohu Azure Portal vyberte tlačítko Cloud Shell .

    Další informace najdete v tématu Azure CLI a Přehled Azure Cloud Shell.

  2. Pokud jste to ještě neověřili, 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. Vytvořte Trezor klíčů ve skupině prostředků pomocí následujícího příkazu, kde {KEY VAULT NAME} je nový název trezoru klíčů a {LOCATION} oblast Azure:

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

    Názvy tajných kódů Azure Key Vault jsou omezené na alfanumerické znaky a pomlčky. Hierarchické hodnoty (konfigurační oddíly) používají -- jako oddělovač (dvě pomlčky), protože dvojtečky nejsou povoleny v tajných názvech trezoru klíčů. dvojtečky vymezují oddíl z podklíče v konfiguraci ASP.NET Core. Po načtení tajných klíčů do konfigurace aplikace se dvě přerušované sekvence nahradí dvojtečkou.

    Následující tajné klíče jsou pro použití s ukázkovou aplikací. Hodnoty zahrnují _prod příponu pro jejich rozlišení od _dev hodnot přípony načtených ve vývojovém prostředí ze Správce tajných klíčů. Nahraďte {KEY VAULT NAME} názvem trezoru klíčů, 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 Azure AD, Azure Key Vault a aplikaci tak, aby používala ID aplikace Azure AD a certifikát X. 509 k ověření pro Trezor klíčů, Pokud je aplikace hostovaná mimo Azure. Další informace najdete v tématu o klíčích, tajných klíčích a certifikátech.

Poznámka

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

Ukázková aplikace používá ID aplikace a certifikát X. 509 v případě, že #define direktiva preprocesoru v horní části programu. cs je nastavená na Certificate .

  1. Vytvořte certifikát PKCS # 12 (. pfx). mezi možnosti vytváření certifikátů patří MakeCert pro 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ých je volitelné. Poznamenejte si kryptografický otisk certifikátu, který se používá později v tomto procesu.
  3. Exportujte certifikát PKCS # 12 (. pfx) jako certifikát kódovaný v kódování DER (. cer).
  4. Zaregistrujte aplikaci ve službě Azure AD (Registrace aplikací).
  5. Upload certifikát s kódováním DER (. cer) do služby Azure AD:
    1. Vyberte aplikaci ve službě Azure AD.
    2. Přejděte na certifikáty & tajných kódů.
    3. vyberte Upload certifikát pro nahrání certifikátu, který obsahuje veřejný klíč. Je přijatelný certifikát . cer, . pem nebo . CRT .
  6. Uložte název trezoru klíčů, ID aplikace a kryptografický otisk certifikátu do appsettings.json souboru aplikace.
  7. V Azure Portal přejděte na trezory klíčů .
  8. Vyberte Trezor klíčů, který jste vytvořili v tajném úložišti, v produkčním prostředí s Azure Key Vault oddílem.
  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 vytvořit seznam .
  12. Vyberte Vybrat objekt zabezpečení a vyberte zaregistrovanou aplikaci podle názvu. Vyberte tlačítko Vybrat.
  13. Vyberte OK.
  14. Vyberte Uložit.
  15. Nasaďte aplikaci.

CertificateUkázková aplikace získá své konfigurační hodnoty ze IConfigurationRoot stejného názvu jako název tajného kódu:

  • Nehierarchické hodnoty: hodnota pro SecretName je získána s config["SecretName"] .
  • Hierarchické hodnoty (oddíly): použijte : notaci (dvojtečku) nebo GetSection metodu rozšíření. 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 hodnoty poskytnuté appsettings.json souborem:

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

Příklady hodnot:

  • Název trezoru klíčů: contosovault
  • ID aplikace: 627e911e-43cc-61d4-992e-12db9c81b413
  • 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"
}

Když aplikaci spouštíte, zobrazí se na webové stránce načtené tajné hodnoty. Ve vývojovém prostředí se tajné hodnoty načítají s _dev příponou. V produkčním prostředí se hodnoty načítají s _prod příponou.

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

Aplikace nasazená do Azure může využít výhod spravovaných identit pro prostředky Azure. Spravovaná identita umožňuje aplikaci Azure Key Vault ověřování pomocí ověřování Azure AD bez přihlašovacích údajů (ID aplikace a hesla/tajného klíče klienta) uložené v aplikaci.

Ukázková aplikace používá spravované identity pro prostředky Azure, když je direktiva preprocesoru v horní části souboru #define Program.cs nastavená na Managed .

Zadejte název trezoru do souboru appsettings.json aplikace. Ukázková aplikace při nastavení na verzi nevyžaduje ID aplikace a heslo (tajný kód klienta), takže tyto položky konfigurace Managed můžete ignorovat. Aplikace se nasadí do Azure a Azure ji ověří, aby Azure Key Vault přístup jenom pomocí názvu trezoru uloženého v appsettings.json souboru.

Nasaďte ukázkovou aplikaci do Azure App Service.

Aplikace nasazená do Azure App Service se při vytvoření služby automaticky zaregistrovala ve službě Azure AD. Získejte ID objektu z nasazení pro použití v následujícím příkazu. ID objektu se zobrazí v Azure Portal panelu Identity na App Service.

Pomocí Azure CLI a ID objektu aplikace poskytněte aplikaci oprávnění a list get pro přístup k trezoru klíčů:

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

Restartujte aplikaci pomocí Azure CLI, PowerShellu nebo 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.
  • Vytvoří se SecretClient nový objekt s instancí DefaultAzureCredential .
  • Instance se používá s instancí , která načte hodnoty tajných klíčů a nahradí v názvech klíčů dvojité SecretClient pomlčky ( ) KeyVaultSecretManager dvojtečkami ( -- : ).
// 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>());

Příklad hodnoty názvu trezoru klíčů: contosovault

appsettings.json:

{
  "KeyVaultName": "Key Vault Name"
}

Při spuštění aplikace se na webové stránce zobrazí hodnoty načteného tajného kódu. Ve vývojovém prostředí mají tajné hodnoty příponu , protože je poskytuje _dev Secret Manager. V produkčním prostředí se hodnoty načítá s příponou , protože je poskytuje _prod Azure Key Vault.

Pokud se zobrazí chyba, ověřte, že je aplikace zaregistrovaná ve službě Azure AD a Access denied poskytla přístup k trezoru klíčů. Potvrďte, že jste službu v Azure restartli.

Informace o použití zprostředkovatele se spravovanou identitou a Azure Pipelines najdete v tématu Vytvoření připojení Azure Resource Manager služby 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())
    {
        ...
    });

Objekt AzureKeyVaultConfigurationOptions obsahuje následující vlastnosti.

Vlastnost Popis
Manager IKeyVaultSecretManager Instance, která se používá k řízení načítání tajných klíče.
ReloadInterval TimeSpan čeká mezi pokusy o dotazování trezoru klíčů na změny. Výchozí hodnota je null (konfigurace se znovu načítá).

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

AddAzureKeyVault poskytuje přetížení, které přijímá implementaci , která umožňuje řídit způsob převodu tajných kódů trezoru klíčů IKeyVaultSecretManager na konfigurační klíče. Můžete například implementovat rozhraní pro načtení hodnot tajných kódu na základě hodnoty předpony, kterou poskytnete při spuštění aplikace. Tato technika vám například umožňuje načíst tajné kódy na základě verze aplikace.

Upozornění

Nepoužívejte předpony tajných kódů trezoru klíčů k:

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

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

V následujícím příkladu je tajný kód vytvořen v trezoru klíčů (a použití Secret Manageru pro vývojové prostředí) pro (tečky nejsou povolené v názvech tajných klíčů 5000-AppSecret trezoru klíčů). 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 klíčů přidá tajný kód (a pomocí Secret Manageru) pro 5100-AppSecret . Každá verze aplikace načte hodnotu tajného klíče ve verzi do své konfigurace jako , takže se při načítání tajného klíče odebere AppSecret verze.

AddAzureKeyVault se volá s vlastní IKeyVaultSecretManager 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ů pro 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. Ostatní tajné kódy se načítají.
  • GetKey:
    • Odebere předponu z názvu tajného kódu.
    • Nahradí dvě pomlčky v libovolném názvu oddělovačem použitým v konfiguraci KeyDelimiter (obvykle dvojtečkou). Azure Key Vault nepovoluje dvojtečku v názvech tajných názvů.
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ý prochází tajné kódy trezoru a najde tajné kódy s předponou verze. Když se v nástroji nachází předpona verze, algoritmus pomocí metody vrátí Load GetKey název konfigurace tajného kódu. Odebere předponu verze z názvu tajného kódu. Zbývající část názvu tajného klíče se vrátí pro načtení do párů název-hodnota konfigurace aplikace.

Při implementaci tohoto přístupu:

  1. Verze aplikace určená 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 se v souboru projektu aplikace nachází vlastnost , kde <UserSecretsId> je identifikátor GUID zadaný {GUID} uživatelem:

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

    Uložte následující tajné kódy místně pomocí nástroje Secret Manager:

    dotnet user-secrets set "5000-AppSecret" "5.0.0.0_secret_value_dev"
    dotnet user-secrets set "5100-AppSecret" "5.1.0.0_secret_value_dev"
    
  3. Tajné kódy se ukládají 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čítají tajné kódy trezoru klíčů. Tajný kód řetězce pro se shoduje s verzí aplikace zadanou 5000-AppSecret v souboru projektu aplikace ( 5.0.0.0 ).

  5. Verze 5000 (s pomlčkou) je z názvu klíče vyříznutá. Čtení konfigurace v celé aplikaci pomocí klíče načte AppSecret hodnotu tajného klíče.

  6. Pokud se verze aplikace v souboru projektu změní na a aplikace se spustí znovu, vrácená hodnota tajného klíče se nachází ve vývojovém prostředí a 5.1.0.0 5.1.0.0_secret_value_dev v 5.1.0.0_secret_value_prod produkčním prostředí.

Poznámka

Můžete také poskytnout vlastní SecretClient implementaci pro AddAzureKeyVault . Vlastní klient umožňuje sdílení jedné instance klienta v aplikaci.

Vytvoření vazby pole k třídě

Zprostředkovatel může číst konfigurační hodnoty do pole pro vazbu na pole OBJEKTŮ POCO.

Při čtení ze zdroje konfigurace, který umožňuje, aby klíče obsahovaly oddělovače dvojtečky ( ), se k odlišení klíčů, které tvoří pole : ( :0: , , :1::{n}: ). Další informace najdete v tématu Konfigurace: Vytvoření vazby pole ke třídě.

Azure Key Vault klíče nelze použít dvojtečku jako oddělovač. Přístup popsaný v tomto dokumentu používá dvojité pomlčky ( -- ) jako oddělovač hierarchických hodnot (oddílů). Klíče polí se ukládají v Azure Key Vault s dvojitými pomlčkami a segmenty číselných klíčů ( --0-- --1-- , , … --{n}-- ).

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

"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žená v Azure Key Vault pomocí dvou pomlčky ( -- ) a číselných segmentů:

Klíč Hodnota
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ů

Tajné kódy se uchová do IConfigurationRoot.Reload() mezipaměti, dokud se nezavolána. Aplikace do spuštění nedo souladu s vypršením platnosti, zakázanými a aktualizovanými tajnými kódy v Reload trezoru klíčů.

Configuration.Reload();

Zakázané tajné kódy a jejich platnost vypršela

Zakázané a prošlé tajné kódy vy vyvolat RequestFailedException výjimku . Pokud chcete aplikaci zabránit v vyvolání, zadejte konfiguraci pomocí jiného zprostředkovatele konfigurace nebo aktualizujte zakázaný nebo prošlý tajný klíč.

Řešení potíží

Pokud se aplikaci nepodaří načíst konfiguraci pomocí zprostředkovatele, zapisuje se chybová zpráva do infrastruktury ASP.NET Core protokolování. Následující podmínky zabrání v načítání konfigurace:

  • Aplikace nebo certifikát nejsou ve službě Azure AD správně nakonfigurované.
  • Trezor klíčů v tomto úložišti Azure Key Vault.
  • Aplikace nemá oprávnění pro přístup k trezoru klíčů.
  • Zásady přístupu nezahrnují oprávnění Get List a .
  • V trezoru klíčů jsou konfigurační data (dvojice název-hodnota) nesprávně pojmenována, chybí, zakázána nebo vypršela jeho platnost.
  • Aplikace má nesprávný název trezoru klíčů ( ), ID aplikace Azure AD ( ) nebo kryptografický otisk certifikátu Azure AD ( ) nebo ID adresáře KeyVaultName AzureADApplicationId Azure AD ( AzureADCertThumbprint AzureADDirectoryId ).
  • Konfigurační klíč (název) je v aplikaci nesprávný pro hodnotu, kterou se pokoušíte načíst.
  • Při přidávání zásad přístupu trezoru klíčů pro aplikaci se zásada vytvořila, ale v uživatelském rozhraní zásad přístupu nebylo vybráno tlačítko Uložit.

Další zdroje informací

tento dokument vysvětluje, jak pomocí poskytovatele konfigurace Microsoft Azure Key Vault načíst hodnoty konfigurace aplikace z Azure Key Vault tajných klíčů. Azure Key Vault je cloudová služba, která pomáhá chránit kryptografické klíče a tajné klíče používané aplikacemi a službami. mezi běžné scénáře použití Azure Key Vault s ASP.NET Core aplikacemi patří:

  • Řízení přístupu k citlivým datům konfigurace.
  • Splnění požadavku na Standard FIPS 140-2 úrovně 2 HSM (Hardware Security Module) pro ukládání konfiguračních dat.

Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)

Balíčky

Přidejte odkaz na balíček do balíčku Microsoft. Extensions. Configuration. AzureKeyVault .

Ukázková aplikace

Ukázková aplikace běží v jednom ze dvou režimů určených #define direktivou preprocesoru v horní části programu. cs:

  • Certificate: Ukazuje použití ID klienta Azure Key Vault a certifikátu X. 509 pro přístup k tajným klíčům uloženým v Azure Key Vault. tuto ukázku můžete spustit z libovolného umístění, ať už je nasazená do Azure App Service nebo libovolného hostitele, který může sloužit ASP.NET Core aplikace.
  • Managed: ukazuje použití spravovaných identit pro prostředky Azure k ověření aplikace pro Azure Key Vault s ověřováním Azure Active Directory (AD) bez přihlašovacích údajů uložených v kódu nebo konfiguraci aplikace. Při ověřování identity pomocí spravovaných identit se nevyžaduje ID a heslo aplikace služby Azure AD (tajný klíč klienta). ManagedVerze ukázky musí být nasazená do 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 ) naleznete v tématu Úvod do ASP.NET Core .

Tajné úložiště ve vývojovém prostředí

Místní nastavení tajných kódů pomocí správce tajnýchklíčů. Když je ukázková aplikace spuštěná na místním počítači ve vývojovém prostředí, načtou se tajné klíče z úložiště tajných klíčů místního uživatele.

Správce tajných klíčů 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 jsou vytvořeny jako páry název-hodnota. hierarchické hodnoty (konfigurační oddíly) používají : jako oddělovač v ASP.NET Core názvů konfiguračních klíčů středník (dvojtečku).

Správce tajného klíče se používá z příkazového prostředí otevřeného v kořenovém adresáři obsahuprojektu, kde {SECRET NAME} je název a {SECRET VALUE} je hodnota:

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

Spusťte následující příkazy v příkazovém prostředí z kořenu obsahu projektu pro nastavení tajných kódů 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 tyto tajné klíče uložené v Azure Key Vault v tajném úložišti v produkčním prostředí s Azure Key Vault oddílu, _dev přípona se změní na _prod . Přípona poskytuje vizuální hromádku ve výstupu aplikace, která označuje zdroj hodnot konfigurace.

Tajné úložiště v produkčním prostředí pomocí Azure Key Vault

Pokyny poskytované rychlým startem: nastavení a načtení tajného klíče z Azure Key Vault pomocí rozhraní příkazového řádku Azure jsou shrnuté pro vytvoření Azure Key Vault a ukládání tajných kódů používaných ukázkovou aplikací.

  1. Otevřete Azure Cloud Shell pomocí některé z následujících metod v 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".
    • Otevřete Cloud Shell v prohlížeči pomocí tlačítka pro spuštění Cloud Shell .
    • V nabídce v pravém horním rohu Azure Portal vyberte tlačítko Cloud Shell .

    Další informace najdete v tématu Azure CLI a Přehled Azure Cloud Shell.

  2. Pokud jste to ještě neověřili, 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. Vytvořte Trezor klíčů ve skupině prostředků pomocí následujícího příkazu, kde {KEY VAULT NAME} je nový název trezoru klíčů a {LOCATION} oblast Azure:

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

    Názvy tajných kódů Azure Key Vault jsou omezené na alfanumerické znaky a pomlčky. Hierarchické hodnoty (konfigurační oddíly) používají -- jako oddělovač (dvě pomlčky), protože dvojtečky nejsou povoleny v tajných názvech trezoru klíčů. dvojtečky vymezují oddíl z podklíče v konfiguraci ASP.NET Core. Po načtení tajných klíčů do konfigurace aplikace se dvě přerušované sekvence nahradí dvojtečkou.

    Následující tajné klíče jsou pro použití s ukázkovou aplikací. Hodnoty zahrnují _prod příponu pro jejich rozlišení od _dev hodnot přípony načtených ve vývojovém prostředí ze Správce tajných klíčů. Nahraďte {KEY VAULT NAME} názvem trezoru klíčů, 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 Azure AD, Azure Key Vault a aplikaci tak, aby používala ID aplikace Azure AD a certifikát X. 509 k ověření pro Trezor klíčů, Pokud je aplikace hostovaná mimo Azure. Další informace najdete v tématu o klíčích, tajných klíčích a certifikátech.

Poznámka

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

Ukázková aplikace používá ID aplikace a certifikát X. 509, pokud #define je příkaz v horní části souboru program. cs nastavený na Certificate .

  1. Vytvořte certifikát PKCS # 12 (. pfx). mezi možnosti vytváření certifikátů patří MakeCert pro 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ých je volitelné. Poznamenejte si kryptografický otisk certifikátu, který se používá později v tomto procesu.
  3. Exportujte certifikát PKCS # 12 (. pfx) jako certifikát kódovaný v kódování DER (. cer).
  4. Zaregistrujte aplikaci ve službě Azure AD (Registrace aplikací).
  5. Upload certifikát s kódováním DER (. cer) do služby Azure AD:
    1. Vyberte aplikaci ve službě Azure AD.
    2. Přejděte na certifikáty & tajných kódů.
    3. vyberte Upload certifikát pro nahrání certifikátu, který obsahuje veřejný klíč. Je přijatelný certifikát . cer, . pem nebo . CRT .
  6. Uložte název trezoru klíčů, ID aplikace a kryptografický otisk certifikátu do appsettings.json souboru aplikace.
  7. V Azure Portal přejděte na trezory klíčů .
  8. Vyberte Trezor klíčů, který jste vytvořili v tajném úložišti, v produkčním prostředí s Azure Key Vault oddílem.
  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 vytvořit seznam .
  12. Vyberte Vybrat objekt zabezpečení a vyberte zaregistrovanou aplikaci podle názvu. Vyberte tlačítko Vybrat.
  13. Vyberte OK.
  14. Vyberte Uložit.
  15. Nasaďte aplikaci.

CertificateUkázková aplikace získá své konfigurační hodnoty ze IConfigurationRoot stejného názvu jako název tajného kódu:

  • Nehierarchické hodnoty: hodnota pro SecretName je získána s config["SecretName"] .
  • Hierarchické hodnoty (oddíly): použijte : notaci (dvojtečku) nebo GetSection metodu rozšíření. 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 hodnoty poskytnuté appsettings.json souborem:

// using System.Linq;
// using System.Security.Cryptography.X509Certificates;
// using Microsoft.Extensions.Configuration;

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.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(
                        $"https://{builtConfig["KeyVaultName"]}.vault.azure.net/",
                        builtConfig["AzureADApplicationId"],
                        certs.OfType<X509Certificate2>().Single());

                    store.Close();
                }
            }
        })
        .UseStartup<Startup>();

Příklady hodnot:

  • Název trezoru klíčů: contosovault
  • ID aplikace: 627e911e-43cc-61d4-992e-12db9c81b413
  • Kryptografický otisk certifikátu: fe14593dd66b2406c5269d742d04b6e1ab03adb1

appsettings.json:

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

Když aplikaci spouštíte, zobrazí se na webové stránce načtené tajné hodnoty. Ve vývojovém prostředí se tajné hodnoty načítají s _dev příponou. V produkčním prostředí se hodnoty načítají s _prod příponou.

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

Aplikace nasazená do Azure může využít výhod spravovaných identit pro prostředky Azure. Spravovaná identita umožňuje aplikaci Azure Key Vault ověřování pomocí ověřování Azure AD bez přihlašovacích údajů (ID aplikace a hesla/tajného klíče klienta) uložené v aplikaci.

Ukázková aplikace používá spravované identity pro prostředky Azure, pokud #define je příkaz v horní části souboru . cs pro program nastavený na Managed .

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

Nasaďte ukázkovou aplikaci do Azure App Service.

Aplikace nasazená do Azure App Service se při vytvoření služby automaticky zaregistruje ve službě Azure AD. Získejte ID objektu z nasazení pro použití v následujícím příkazu. ID objektu se zobrazí v Azure Portal panelu Identity na App Service.

Pomocí Azure CLI a ID objektu aplikace poskytněte aplikaci oprávnění a list get pro přístup k trezoru klíčů:

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

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

Ukázková aplikace:

  • Vytvoří instanci třídy AzureServiceTokenProvider bez připojovacího řetězce. Pokud není zadaný připojovací řetězec, poskytovatel se pokusí získat přístupový token ze spravovaných identit pro prostředky Azure.
  • Vytvoří se KeyVaultClient nový se zpětným AzureServiceTokenProvider voláním tokenu instance.
  • Instance se používá s výchozí implementací , která načte všechny hodnoty tajných klíčů a nahradí v názvech klíčů dvojité KeyVaultClient pomlčky ( ) IKeyVaultSecretManager dvojtečkami ( -- : ).
// using Microsoft.Azure.KeyVault;
// using Microsoft.Azure.Services.AppAuthentication;
// using Microsoft.Extensions.Configuration.AzureKeyVault;

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

                var azureServiceTokenProvider = new AzureServiceTokenProvider();
                var keyVaultClient = new KeyVaultClient(
                    new KeyVaultClient.AuthenticationCallback(
                        azureServiceTokenProvider.KeyVaultTokenCallback));

                config.AddAzureKeyVault(
                    $"https://{builtConfig["KeyVaultName"]}.vault.azure.net/",
                    keyVaultClient,
                    new DefaultKeyVaultSecretManager());
            }
        })
        .UseStartup<Startup>();

Příklad hodnoty názvu trezoru klíčů: contosovault

appsettings.json:

{
  "KeyVaultName": "Key Vault Name"
}

Při spuštění aplikace se na webové stránce zobrazí hodnoty načteného tajného kódu. Ve vývojovém prostředí mají tajné hodnoty příponu , protože je poskytuje _dev Secret Manager. V produkčním prostředí se hodnoty načítá s příponou , protože je poskytuje _prod Azure Key Vault.

Pokud se zobrazí chyba, ověřte, že je aplikace zaregistrovaná ve službě Azure AD a Access denied poskytla přístup k trezoru klíčů. Ověřte, že jste službu v Azure restartli.

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

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

AddAzureKeyVault poskytuje přetížení, které přijímá implementaci IKeyVaultSecretManager . Toto přetížení umožňuje řídit způsob převodu tajných kódů trezoru klíčů na konfigurační klíče. Můžete například implementovat rozhraní pro načtení hodnot tajných kódu na základě hodnoty předpony, kterou poskytnete při spuštění aplikace. Tato technika vám například umožňuje načíst tajné kódy na základě verze aplikace.

Upozornění

Nepoužívejte předpony tajných kódů trezoru klíčů k umístění tajných kódů pro více aplikací do stejného trezoru klíčů ani k umístění tajných kódů prostředí (například vývojových a produkčních tajných kódů) do stejného trezoru. Doporučujeme, aby různé aplikace a vývojové/produkční prostředí k izolaci prostředí aplikací pro zajištění nejvyšší úrovně zabezpečení používají samostatné trezory klíčů.

V následujícím příkladu je tajný kód vytvořen v trezoru klíčů (a použití Secret Manageru pro vývojové prostředí) pro (tečky nejsou povolené v názvech tajných klíčů 5000-AppSecret trezoru klíčů). 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 klíčů přidá tajný kód (a pomocí Secret Manageru) pro 5100-AppSecret . Každá verze aplikace načte hodnotu tajného klíče ve verzi do své konfigurace jako , takže se při načítání tajného klíče odebere AppSecret verze.

AddAzureKeyVault se volá s vlastním IKeyVaultSecretManager :

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

Implementace IKeyVaultSecretManager reaguje na předpony verzí tajných kódů pro 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. Ostatní tajné kódy se načítají.
  • GetKey:
    • Odebere předponu z názvu tajného kódu.
    • Nahradí dvě pomlčky v libovolném názvu oddělovačem použitým v konfiguraci KeyDelimiter (obvykle dvojtečkou). Azure Key Vault nepovoluje dvojtečku v názvech tajných názvů.
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ý prochází tajné kódy trezoru a najde ty, které mají předponu verze. Když se v nástroji nachází předpona verze, algoritmus pomocí metody vrátí Load GetKey název konfigurace tajného kódu. Odebere předponu verze z názvu tajného kódu. Zbývající část názvu tajného klíče se vrátí pro načtení do párů název-hodnota konfigurace aplikace.

Při implementaci tohoto přístupu:

  1. Verze aplikace určená 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 se v souboru projektu aplikace nachází vlastnost , kde <UserSecretsId> je identifikátor GUID zadaný {GUID} uživatelem:

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

    Uložte následující tajné kódy místně pomocí nástroje Secret Manager:

    dotnet user-secrets set "5000-AppSecret" "5.0.0.0_secret_value_dev"
    dotnet user-secrets set "5100-AppSecret" "5.1.0.0_secret_value_dev"
    
  3. Tajné kódy se ukládají 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čítají tajné kódy trezoru klíčů. Tajný kód řetězce pro se shoduje s verzí aplikace zadanou 5000-AppSecret v souboru projektu aplikace ( 5.0.0.0 ).

  5. Verze 5000 (s pomlčkou) je z názvu klíče vyříznutá. Čtení konfigurace v celé aplikaci pomocí klíče načte AppSecret hodnotu tajného klíče.

  6. Pokud se verze aplikace v souboru projektu změní na a aplikace se spustí znovu, vrácená hodnota tajného klíče se nachází ve vývojovém prostředí a 5.1.0.0 5.1.0.0_secret_value_dev v 5.1.0.0_secret_value_prod produkčním prostředí.

Poznámka

Můžete také poskytnout vlastní KeyVaultClient implementaci pro AddAzureKeyVault . Vlastní klient umožňuje sdílení jedné instance klienta v aplikaci.

Vytvoření vazby pole k třídě

Zprostředkovatel může číst konfigurační hodnoty do pole pro vazbu na pole OBJEKTŮ POCO.

Při čtení ze zdroje konfigurace, který umožňuje, aby klíče obsahovaly oddělovače dvojtečky ( ), se k odlišení klíčů, které tvoří pole : ( :0: , , :1::{n}: ). Další informace najdete v tématu Konfigurace: Vytvoření vazby pole ke třídě.

Azure Key Vault klíče nelze použít dvojtečku jako oddělovač. Přístup popsaný v tomto dokumentu používá dvojité pomlčky ( -- ) jako oddělovač hierarchických hodnot (oddílů). Klíče polí se ukládají v Azure Key Vault s dvojitými pomlčkami a segmenty číselných klíčů ( --0-- --1-- , , … --{n}-- ).

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

"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žená v Azure Key Vault pomocí dvou pomlčky ( -- ) a číselných segmentů:

Klíč Hodnota
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ů

Tajné kódy se uchová do IConfigurationRoot.Reload() mezipaměti, dokud se nezavolána. Aplikace do spuštění nedo souladu s vypršením platnosti, zakázaným a aktualizovaným tajným Reload kódem v trezoru klíčů.

Configuration.Reload();

Zakázané tajné kódy a tajné kódy s vypršenou platností

Zakázané a prošlé tajné kódy vy throw KeyVaultErrorException . Pokud chcete aplikaci zabránit v vyvolání, zadejte konfiguraci pomocí jiného zprostředkovatele konfigurace nebo aktualizujte zakázaný tajný klíč nebo tajný kód, jehož platnost vypršela.

Řešení potíží

Pokud se aplikaci nepodaří načíst konfiguraci pomocí zprostředkovatele, zapisuje se chybová zpráva do infrastruktury ASP.NET Core protokolování. Následující podmínky zabrání v načítání konfigurace:

  • Aplikace nebo certifikát nejsou ve službě Azure AD správně nakonfigurované.
  • Trezor klíčů v tomto úložišti Azure Key Vault.
  • Aplikace nemá oprávnění pro přístup k trezoru klíčů.
  • Zásady přístupu nezahrnují oprávnění Get List a .
  • V trezoru klíčů jsou konfigurační data (pár název-hodnota) nesprávně pojmenována, chybí, zakázána nebo vypršela jeho platnost.
  • Aplikace má nesprávný název trezoru klíčů ( ), ID aplikace KeyVaultName Azure AD ( ) nebo kryptografický otisk AzureADApplicationId certifikátu Azure AD ( AzureADCertThumbprint ).
  • Konfigurační klíč (název) je v aplikaci nesprávný pro hodnotu, kterou se pokoušíte načíst.
  • Při přidávání zásad přístupu pro aplikaci do trezoru klíčů se zásada vytvořila, ale v uživatelském rozhraní zásad přístupu nebylo vybráno tlačítko Uložit.

Další zdroje informací