Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt uitgelegd hoe u de Azure Key Vault-configuratieprovider gebruikt om app-configuratiewaarden te laden uit Azure Key Vault-geheimen. Azure Key Vault is een cloudservice waarmee cryptografische sleutels en geheimen worden beveiligd die worden gebruikt door apps en services. Veelvoorkomende scenario's voor het gebruik van Azure Key Vault met ASP.NET Core-apps zijn:
- Toegang tot gevoelige configuratiegegevens beheren.
- Voldoen aan de vereiste voor FIPS 140-2 Level 2 gevalideerde HSM's (Hardware Security Modules) bij het opslaan van configuratiegegevens.
Packages
Voeg pakketverwijzingen toe voor de volgende pakketten:
Voorbeeld-app
De voorbeeld-app wordt uitgevoerd in een van de twee modi die worden bepaald door de #define preprocessor-instructie boven Program.csaan:
-
Certificate: Demonstreert het gebruik van een Azure Key Vault-client-id en een X.509-certificaat voor toegang tot geheimen die zijn opgeslagen in Azure Key Vault. Dit voorbeeld kan worden uitgevoerd vanaf elke locatie, ongeacht of deze is geïmplementeerd in Azure App Service of een host die een ASP.NET Core-app kan leveren. -
Managed: Laat zien hoe u beheerde identiteiten gebruikt voor Azure-resources. De beheerde identiteit verifieert de app bij Azure Key Vault met beheerde identiteiten voor Azure-resources zonder referenties op te slaan in de code of configuratie van de app. DeManagedversie van het voorbeeld moet worden geïmplementeerd in Azure. Volg de richtlijnen in het gedeelte Beheerde identiteiten gebruiken voor Azure-resources .
Zie #define voor meer informatie over het configureren van een voorbeeld-app met behulp van preprocessorrichtlijnen ().
Voorbeeldcode bekijken of downloaden (hoe download je)
Geheime opslag in de ontwikkelomgeving
Geheimen lokaal instellen met Secret Manager. Wanneer de voorbeeld-app wordt uitgevoerd op de lokale computer in de ontwikkelomgeving, worden geheimen geladen vanuit het archief met lokale gebruikersgeheimen.
Secret Manager vereist een <UserSecretsId> eigenschap in het projectbestand van de app. Stel de eigenschapswaarde ({GUID}) in op een unieke GUID:
<PropertyGroup>
<UserSecretsId>{GUID}</UserSecretsId>
</PropertyGroup>
Geheimen worden aangemaakt als naam-waardeparen. Hiërarchische waarden (configuratiesecties) gebruiken een : (dubbele punt) als scheidingsteken in ASP.NET Core-configuratiesleutelnamen .
Secret Manager wordt gebruikt vanuit een opdrachtshell die is geopend in de hoofdmap van het project, waar {SECRET NAME} de naam en {SECRET VALUE} de waarde is:
dotnet user-secrets set "{SECRET NAME}" "{SECRET VALUE}"
Voer de volgende opdrachten uit in een opdrachtshell vanuit de hoofdmap van de inhoud van het project om de geheimen voor de voorbeeld-app in te stellen:
dotnet user-secrets set "SecretName" "secret_value_1_dev"
dotnet user-secrets set "Section:SecretName" "secret_value_2_dev"
Wanneer deze geheimen worden opgeslagen in Azure Key Vault in de sectie Geheime opslag in de productieomgeving met Azure Key Vault, wordt het achtervoegsel _dev gewijzigd in _prod. Het achtervoegsel biedt een visuele aanwijzing in de uitvoer van de app die de bron van de configuratiewaarden aangeeft.
Geheime opslag in de productieomgeving met Azure Key Vault
Voer de volgende stappen uit om een Azure Key Vault te maken en de geheimen van de voorbeeld-app erin op te slaan. Zie de quickstart: Een geheim instellen en ophalen uit Azure Key Vault met behulp van Azure CLI voor meer informatie.
Open Azure Cloud Shell met behulp van een van de volgende methoden in Azure Portal:
- Selecteer Nu proberen in de rechterbovenhoek van een codeblok. Gebruik de zoekreeks 'Azure CLI' in het tekstvak.
- Open Cloud Shell in uw browser met de knop Cloud Shell starten .
- Selecteer de knop Cloud Shell in het menu in de rechterbovenhoek van Azure Portal.
Zie Azure CLI en overzicht van Azure Cloud Shell voor meer informatie.
Als u nog niet bent geverifieerd, meldt u zich aan met de
az loginopdracht.Maak een resourcegroep met de volgende opdracht, waarbij
{RESOURCE GROUP NAME}de naam van de nieuwe resourcegroep en{LOCATION}de Azure-regio is:az group create --name "{RESOURCE GROUP NAME}" --location {LOCATION}Maak een Sleutelkluis in de resourcegroep met de volgende opdracht, waarbij
{KEY VAULT NAME}de naam van de nieuwe kluis en{LOCATION}de Azure-regio is:az keyvault create --name {KEY VAULT NAME} --resource-group "{RESOURCE GROUP NAME}" --location {LOCATION}Maak geheimen in de kluis als naam-waardeparen.
Azure Key Vault-geheime namen zijn beperkt tot alfanumerieke tekens en streepjes. Hiërarchische waarden (configuratiesecties) maken gebruik van
--(twee streepjes) als scheidingsteken, aangezien dubbele punten niet zijn toegestaan in namen van Key Vault-geheimen. Dubbele punten scheiden een sectie van een subsleutel in ASP.NET Core-configuratie. De reeks met twee streepjes wordt vervangen door een dubbele punt wanneer de geheimen worden geladen in de instellingen van de app.De volgende geheimen zijn bedoeld voor gebruik met de voorbeeld-app. De waarden bevatten een
_prodachtervoegsel om deze te onderscheiden van de_devachtervoegselwaarden die in de ontwikkelomgeving zijn geladen vanuit Secret Manager. Vervang{KEY VAULT NAME}door de naam van de sleutelkluis die u in de vorige stap hebt gemaakt: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"
Toepassings-id en X.509-certificaat gebruiken voor niet-Door Azure gehoste apps
Configureer Azure Key Vault en de app voor het gebruik van een Microsoft Entra ID-toepassings-id en X.509-certificaat voor verificatie bij een kluis wanneer de app buiten Azure wordt gehost. Zie Over sleutels, geheimen en certificaten voor meer informatie.
Note
Hoewel het gebruik van een toepassings-id en X.509-certificaat wordt ondersteund voor apps die worden gehost in Azure, wordt dit niet aanbevolen. Gebruik in plaats daarvan beheerde identiteiten voor Azure-resources bij het hosten van een app in Azure. Voor beheerde identiteiten is het opslaan van een certificaat in de app of in de ontwikkelomgeving niet vereist.
De voorbeeld-app maakt gebruik van een toepassings-id en X.509-certificaat wanneer de preprocessor-instructie #define bovenaan Program.cs is ingesteld op Certificate.
- Maak een PKCS#12-archiefcertificaat (.pfx). Opties voor het maken van certificaten zijn New-SelfSignedCertificate in Windows en OpenSSL.
- Installeer het certificaat in het persoonlijke certificaatarchief van de huidige gebruiker. Het markeren van de sleutel als exporteerbaar is optioneel. Noteer de vingerafdruk van het certificaat, die later in dit proces wordt gebruikt.
- Exporteer het PKCS#12-archiefcertificaat (.pfx) als een DER-gecodeerd certificaat (.cer).
- Registreer de app bij Microsoft Entra ID (App-registraties).
- Upload het met DER gecodeerde certificaat (.cer) naar Microsoft Entra-id:
- Selecteer de app in Microsoft Entra ID.
- Navigeer naar Certificaten en geheimen.
- Selecteer Certificaat uploaden om het certificaat te uploaden, dat de openbare sleutel bevat. Een .cer-, PEM- of .crt-certificaat is acceptabel.
- Sla de sleutelkluisnaam, toepassings-id en certificaatvingerafdruk op in het
appsettings.jsonbestand van de app. - Navigeer naar Key Vaults in Azure Portal.
- Selecteer de Key Vault die u hebt gemaakt in de sectie Geheime opslag in de productieomgeving met Azure Key Vault.
- Selecteer Toegangsbeleid.
- Selecteer Toegangsbeleid toevoegen.
- Open geheime machtigingen en geef de app machtigingen voor Ophalen en Weergeven op.
- Selecteer Select principal en selecteer de geregistreerde app op naam. Selecteer de knop Selecteren.
- Kies OK.
- Selecteer Opslaan.
- De app implementeren.
De Certificate voorbeeld-app verkrijgt de configuratiewaarden vanuit IConfigurationRoot met dezelfde naam als de geheime naam:
- Niet-hiërarchische waarden: de waarde voor
SecretNamewordt verkregen metconfig["SecretName"]. - Hiërarchische waarden (secties): Gebruik
:de notatie (dubbele punt) of de GetSection methode. Gebruik een van deze methoden om de configuratiewaarde te verkrijgen:config["Section:SecretName"]config.GetSection("Section")["SecretName"]
Het X.509-certificaat wordt beheerd door het besturingssysteem. De app roept AddAzureKeyVault aan met waarden die zijn opgegeven door het appsettings.json bestand.
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();
Voorbeeldwaarden:
- Key Vault-naam:
contosovault - Applicatie-ID:
00001111-aaaa-2222-bbbb-3333cccc4444 - Vingerafdruk van certificaat:
fe14593dd66b2406c5269d742d04b6e1ab03adb1
appsettings.json:
{
"KeyVaultName": "Key Vault Name",
"AzureADApplicationId": "Azure AD Application ID",
"AzureADCertThumbprint": "Azure AD Certificate Thumbprint",
"AzureADDirectoryId": "Azure AD Directory ID"
}
Wanneer u de app uitvoert, worden op een webpagina de geladen geheime waarden weergegeven. In de ontwikkelomgeving worden geheime waarden geladen met het _dev achtervoegsel. In de productieomgeving worden de waarden geladen met het _prod achtervoegsel.
Beheerde identiteiten gebruiken voor Azure-resources
Een app die in Azure is geïmplementeerd , kan profiteren van beheerde identiteiten voor Azure-resources. Met een beheerde identiteit kan de app worden geverifieerd met Azure Key Vault met behulp van Microsoft Entra ID-verificatie zonder referenties op te slaan in de code of configuratie van de app.
De voorbeeld-app gebruikt een door het systeem toegewezen beheerde identiteit wanneer de #define preprocessor-instructie bovenaan Program.cs is ingesteld op Managed. Zie Hoe beheerde identiteiten te gebruiken voor App Service en Azure Functions om een beheerde identiteit te maken voor een Azure App Service. Zodra de beheerde identiteit is gemaakt, noteert u de object-id van de app die wordt weergegeven in Azure Portal in het Identity deelvenster van de App Service.
Voer de kluisnaam in appsettings.json bestand van de app in. Voor de voorbeeld-app is geen toepassings-id en wachtwoord (clientgeheim) vereist wanneer deze is ingesteld op de Managed versie, zodat u deze configuratie-vermeldingen kunt negeren. De app wordt geïmplementeerd in Azure en Azure verifieert de app om alleen toegang te krijgen tot Azure Key Vault met behulp van de kluisnaam die in het appsettings.json bestand is opgeslagen.
Implementeer de voorbeeld-app in Azure App Service.
Gebruik Azure CLI en het object-id van de app om de app de list en get permissies te geven voor toegang tot de kluis.
az keyvault set-policy --name {KEY VAULT NAME} --object-id {OBJECT ID} --secret-permissions get list
Start de app opnieuw met behulp van Azure CLI, PowerShell of Azure Portal.
Met de voorbeeld-app wordt een exemplaar van de DefaultAzureCredential klasse gemaakt. De referentie probeert een toegangstoken te verkrijgen uit de omgeving voor Azure-resources:
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
In het voorgaande voorbeeld wordt gebruikgemaakt DefaultAzureCredential van het vereenvoudigen van verificatie bij het ontwikkelen van apps die in Azure worden geïmplementeerd door referenties te combineren die worden gebruikt in Azure-hostingomgevingen met referenties die worden gebruikt in lokale ontwikkeling. Wanneer u overstapt op productie, is een alternatief een betere keuze, zoals ManagedIdentityCredential. Zie Azure-gehoste .NET-apps verifiëren bij Azure-resources met behulp van een door het systeem toegewezen beheerde identiteit voor meer informatie.
Voorbeeldwaarde van Key Vault-naam: contosovault
appsettings.json:
{
"KeyVaultName": "Key Vault Name"
}
Voor apps die een door de gebruiker toegewezen beheerde identiteit gebruiken, configureert u de client-id van de beheerde identiteit met behulp van een van de volgende methoden:
Stel de
AZURE_CLIENT_IDomgevingsvariabele in.Stel de DefaultAzureCredentialOptions.ManagedIdentityClientId eigenschap in bij het aanroepen van
AddAzureKeyVault.builder.Configuration.AddAzureKeyVault( new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"), new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = builder.Configuration["AzureADManagedIdentityClientId"] }));
Wanneer u de app uitvoert, worden op een webpagina de geladen geheime waarden weergegeven. In de ontwikkelomgeving hebben geheime waarden het _dev achtervoegsel omdat ze worden geleverd door Secret Manager. In de productieomgeving worden de waarden geladen met het _prod achtervoegsel omdat ze worden geleverd door Azure Key Vault.
Als er een Access denied fout optreedt, controleert u of de app is geregistreerd bij Microsoft Entra ID en toegang heeft gekregen tot de kluis. Controleer of u de service opnieuw hebt opgestart in Azure.
Zie Een Azure Resource Manager-serviceverbinding maken met een virtuele machine met een beheerde service-id voor meer informatie over het gebruik van de provider met een beheerde identiteit en Azure Pipelines.
Configuratieopties
AddAzureKeyVault kan een AzureKeyVaultConfigurationOptions object accepteren:
// using Azure.Extensions.AspNetCore.Configuration.Secrets;
builder.Configuration.AddAzureKeyVault(
new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
new DefaultAzureCredential(),
new AzureKeyVaultConfigurationOptions
{
// ...
});
Het AzureKeyVaultConfigurationOptions object bevat de volgende eigenschappen:
| Property | Description |
|---|---|
| Manager | KeyVaultSecretManager instantie die wordt gebruikt om het laden van geheimen te beheren. |
| ReloadInterval |
TimeSpan om te wachten tussen pogingen om de kluis op wijzigingen te controleren. De standaardwaarde is null (configuratie wordt niet opnieuw geladen). |
Een sleutelnaamvoorvoegsel gebruiken
AddAzureKeyVault biedt een overbelasting die een implementatie accepteert van KeyVaultSecretManager, waarmee u kunt bepalen hoe Key Vault-geheimen worden geconverteerd naar configuratiesleutels. U kunt bijvoorbeeld de interface implementeren om geheime waarden te laden op basis van een voorvoegselwaarde die u bij het opstarten van de app opgeeft. Met deze techniek kunt u bijvoorbeeld geheimen laden op basis van de versie van de app.
Warning
Gebruik geen voorvoegsels in Key Vault-geheimen om:
- Plaats geheimen voor meerdere apps in dezelfde kluis.
- Plaats omgevingsgeheimen (bijvoorbeeld ontwikkeling versus productiegeheimen ) in dezelfde kluis.
Verschillende apps en ontwikkel-/productieomgevingen moeten afzonderlijke Key Vaults gebruiken om app-omgevingen te isoleren voor het hoogste beveiligingsniveau.
In het volgende voorbeeld wordt een geheim tot stand gebracht in Key Vault (en het gebruik van Secret Manager voor de ontwikkelomgeving) voor 5000-AppSecret (perioden zijn niet toegestaan in sleutelkluisgeheimnamen). Dit geheim vertegenwoordigt een app-geheim voor versie 5.0.0.0 van de app. Voor een andere versie van de app, 5.1.0.0, wordt een geheim toegevoegd aan de kluis (en wordt Secret Manager gebruikt) voor 5100-AppSecret. Elke app-versie laadt zijn versiegebonden geheime waarde in de configuratie als AppSecret en verwijdert de versie bij het laden van het geheim.
AddAzureKeyVault wordt aangeroepen met een aangepaste KeyVaultSecretManager implementatie:
// using Azure.Extensions.AspNetCore.Configuration.Secrets;
builder.Configuration.AddAzureKeyVault(
new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
new DefaultAzureCredential(),
new SamplePrefixKeyVaultSecretManager("5000"));
De implementatie reageert op de versievoorvoegsels van geheimen om het juiste geheim in de configuratie te laden:
-
Loadlaadt een geheim wanneer de naam begint met het voorvoegsel. Andere geheimen worden niet geladen. -
GetKey:- Hiermee verwijdert u het voorvoegsel uit de geheime naam.
- Vervangt twee streepjes in een naam door het
KeyDelimiter, dat het scheidingsteken is dat in de configuratie wordt gebruikt (meestal een dubbelpunt). Azure Key Vault staat geen dubbele punt toe in geheime namen.
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);
}
De Load methode wordt aangeroepen door een provider-algoritme dat de kluisgeheimen doorloopt om de geheimen met versievoorvoegsels te vinden. Wanneer een versieprefix wordt gevonden met Load, gebruikt het algoritme de GetKey-methode om de configuratienaam van de geheime sleutelnaam terug te geven. Hiermee wordt het versievoorvoegsel verwijderd uit de naam van het geheim. Het resterende deel van de geheime naam wordt geretourneerd voor het inladen in de naam-waardeparen van de configuratie van de app.
Wanneer deze aanpak wordt geïmplementeerd:
De versie van de app die is opgegeven in het projectbestand van de app. In het volgende voorbeeld is de versie van de app ingesteld op
5.0.0.0:<PropertyGroup> <Version>5.0.0.0</Version> </PropertyGroup>Controleer of een
<UserSecretsId>eigenschap aanwezig is in het projectbestand van de app, waarbij{GUID}een door de gebruiker opgegeven GUID is:<PropertyGroup> <UserSecretsId>{GUID}</UserSecretsId> </PropertyGroup>Sla de volgende geheimen lokaal op met 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"Geheimen worden opgeslagen in Azure Key Vault met behulp van de volgende Azure CLI-opdrachten:
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"Wanneer de app wordt uitgevoerd, worden de Key Vault-geheimen geladen. Het geheime reeks voor
5000-AppSecretkomt overeen met de versie van de app zoals gespecificeerd in het projectbestand van de app (5.0.0.0).De versie (
5000met het streepje) wordt verwijderd uit de sleutelnaam. Door de hele app laadt het lezen van de configuratie met de sleutelAppSecretde geheime waarde.Als de versie van de app wordt gewijzigd in het projectbestand naar
5.1.0.0en de app opnieuw wordt uitgevoerd, is de geretourneerde geheime waarde5.1.0.0_secret_value_devin de ontwikkelomgeving en5.1.0.0_secret_value_prodin Productie.
Note
U kunt ook uw eigen SecretClient-implementatie verschaffen aan AddAzureKeyVault. Met een aangepaste client kan één exemplaar van de client in de app worden gedeeld.
Een matrix binden aan een klasse
De provider kan configuratiewaarden lezen in een matrix voor binding met een POCO-matrix.
Bij het lezen van een configuratiebron waarmee sleutels dubbele puntscheidingstekens kunnen: bevatten, wordt een numeriek sleutelsegment gebruikt om onderscheid te maken tussen de sleutels waaruit een matrix bestaat (:0:, :1:... :{n}:). Zie Configuratie: Een matrix binden aan een klasse voor meer informatie.
Azure Key Vault-sleutels kunnen geen dubbele punt gebruiken als scheidingsteken. De benadering die in dit artikel wordt beschreven, gebruikt dubbele streepjes (--) als scheidingsteken voor hiërarchische waarden (secties). Matrixsleutels worden opgeslagen in Azure Key Vault met dubbele streepjes en numerieke sleutelsegmenten (--0--, --1--... --{n}--).
Bekijk de volgende configuratie van de Serilog-logboekregistratieprovider die wordt geleverd door een JSON-bestand. Er zijn twee letterlijke objectwaarden gedefinieerd in de WriteTo matrix die twee Serilog-sinks weerspiegelen, waarin bestemmingen voor logboekuitvoer worden beschreven:
"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=="
}
}
]
}
De configuratie die in het voorgaande JSON-bestand wordt weergegeven, wordt opgeslagen in Azure Key Vault met behulp van dubbele streepjesnotatie (--) en numerieke segmenten:
| 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== |
Geheimen opnieuw laden
Geheimen worden standaard in de cache opgeslagen door de configuratieprovider voor de levensduur van de app. Geheimen die vervolgens zijn uitgeschakeld of bijgewerkt in de kluis, worden genegeerd door de app.
Als u geheimen opnieuw wilt laden, roept u het volgende IConfigurationRoot.Reloadaan:
config.Reload();
Als u geheimen periodiek opnieuw wilt laden, stelt u de AzureKeyVaultConfigurationOptions.ReloadInterval eigenschap in op een bepaald interval. Zie Configuratieopties voor meer informatie.
Uitgeschakelde en verlopen geheimen
Verlopen geheimen worden standaard opgenomen in de configuratieprovider. Als u waarden voor deze geheimen in app-configuratie wilt uitsluiten, werkt u het verlopen geheim bij of geeft u de configuratie op met behulp van een aangepaste configuratieprovider:
class SampleKeyVaultSecretManager : KeyVaultSecretManager
{
public override bool Load(SecretProperties properties) =>
properties.ExpiresOn.HasValue &&
properties.ExpiresOn.Value > DateTimeOffset.Now;
}
Geef deze aangepaste KeyVaultSecretManager door aan AddAzureKeyVault:
// using Azure.Extensions.AspNetCore.Configuration.Secrets;
builder.Configuration.AddAzureKeyVault(
new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
new DefaultAzureCredential(),
new SampleKeyVaultSecretManager());
Uitgeschakelde geheimen kunnen niet worden opgehaald uit Key Vault en worden nooit opgenomen.
Note
In het voorgaande voorbeeld wordt gebruikgemaakt DefaultAzureCredential van het vereenvoudigen van verificatie bij het ontwikkelen van apps die in Azure worden geïmplementeerd door referenties te combineren die worden gebruikt in Azure-hostingomgevingen met referenties die worden gebruikt in lokale ontwikkeling. Wanneer u overstapt op productie, is een alternatief een betere keuze, zoals ManagedIdentityCredential. Zie Azure-gehoste .NET-apps verifiëren bij Azure-resources met behulp van een door het systeem toegewezen beheerde identiteit voor meer informatie.
Troubleshoot
Wanneer de app de configuratie niet kan laden met behulp van de provider, wordt er een foutbericht naar de ASP.NET Core Logging-infrastructuur geschreven. De volgende voorwaarden verhinderen dat de configuratie wordt geladen:
- De app of het certificaat is niet juist geconfigureerd in Microsoft Entra-id.
- De kluis bestaat niet in Azure Key Vault.
- De app is niet gemachtigd voor toegang tot de kluis.
- Het toegangsbeleid bevat de machtigingen
GetenListniet. - In de kluis zijn de configuratiegegevens (naam-waardepaar) onjuist benoemd, ontbreken ze of zijn ze uitgeschakeld.
- De app heeft de verkeerde Key Vault-naam (
KeyVaultName), de Microsoft Entra ID-toepassings-id (AzureADApplicationId) of de vingerafdruk van het Microsoft Entra ID-certificaat (AzureADCertThumbprint) of de map-id van Microsoft Entra ID (AzureADDirectoryId). - Bij het toevoegen van het Key Vault-toegangsbeleid voor de app is het beleid gemaakt, maar de knop Opslaan is niet geselecteerd in de gebruikersinterface voor toegangsbeleid .
Aanvullende bronnen
- Voorbeeldcode bekijken of downloaden (hoe download je)
- Configuratie in ASP.NET Core
- Documentatie voor Microsoft Azure: Key Vault
- Met HSM beveiligde sleutels genereren en overdragen voor Azure Key Vault
- Quickstart: Een geheim instellen en ophalen uit Azure Key Vault met behulp van een .NET-web-app
- Zelfstudie: Azure Key Vault gebruiken met Azure Windows Virtual Machine in .NET
In dit artikel wordt uitgelegd hoe u de Azure Key Vault-configuratieprovider gebruikt om app-configuratiewaarden te laden uit Azure Key Vault-geheimen. Azure Key Vault is een cloudservice waarmee cryptografische sleutels en geheimen worden beveiligd die worden gebruikt door apps en services. Veelvoorkomende scenario's voor het gebruik van Azure Key Vault met ASP.NET Core-apps zijn:
- Toegang tot gevoelige configuratiegegevens beheren.
- Voldoen aan de vereiste voor FIPS 140-2 Level 2 gevalideerde HSM's (Hardware Security Modules) bij het opslaan van configuratiegegevens.
Packages
Voeg pakketverwijzingen toe voor de volgende pakketten:
Voorbeeld-app
De voorbeeld-app wordt uitgevoerd in een van de twee modi die worden bepaald door de #define preprocessor-instructie boven Program.csaan:
-
Certificate: Demonstreert het gebruik van een Azure Key Vault-client-id en een X.509-certificaat voor toegang tot geheimen die zijn opgeslagen in Azure Key Vault. Dit voorbeeld kan worden uitgevoerd vanaf elke locatie, ongeacht of deze is geïmplementeerd in Azure App Service of een host die een ASP.NET Core-app kan leveren. -
Managed: Laat zien hoe u beheerde identiteiten gebruikt voor Azure-resources. De beheerde identiteit verifieert de app bij Azure Key Vault met beheerde identiteiten voor Azure-resources zonder referenties die zijn opgeslagen in de code of configuratie van de app. Wanneer u beheerde identiteiten gebruikt om te verifiëren, zijn de app-id en het wachtwoord (clientgeheim) van Azure-resources niet vereist. DeManagedversie van het voorbeeld moet worden geïmplementeerd in Azure. Volg de richtlijnen in het gedeelte Beheerde identiteiten gebruiken voor Azure-resources .
Zie #define voor meer informatie over het configureren van een voorbeeld-app met behulp van preprocessorrichtlijnen ().
Voorbeeldcode bekijken of downloaden (hoe download je)
Geheime opslag in de ontwikkelomgeving
Geheimen lokaal instellen met Secret Manager. Wanneer de voorbeeld-app wordt uitgevoerd op de lokale computer in de ontwikkelomgeving, worden geheimen geladen vanuit het archief met lokale gebruikersgeheimen.
Secret Manager vereist een <UserSecretsId> eigenschap in het projectbestand van de app. Stel de eigenschapswaarde ({GUID}) in op een unieke GUID:
<PropertyGroup>
<UserSecretsId>{GUID}</UserSecretsId>
</PropertyGroup>
Geheimen worden aangemaakt als naam-waardeparen. Hiërarchische waarden (configuratiesecties) gebruiken een : (dubbele punt) als scheidingsteken in ASP.NET Core-configuratiesleutelnamen .
Secret Manager wordt gebruikt vanuit een opdrachtshell die is geopend in de hoofdmap van het project, waar {SECRET NAME} de naam en {SECRET VALUE} de waarde is:
dotnet user-secrets set "{SECRET NAME}" "{SECRET VALUE}"
Voer de volgende opdrachten uit in een opdrachtshell vanuit de hoofdmap van de inhoud van het project om de geheimen voor de voorbeeld-app in te stellen:
dotnet user-secrets set "SecretName" "secret_value_1_dev"
dotnet user-secrets set "Section:SecretName" "secret_value_2_dev"
Wanneer deze geheimen worden opgeslagen in Azure Key Vault in de sectie Geheime opslag in de productieomgeving met Azure Key Vault, wordt het achtervoegsel _dev gewijzigd in _prod. Het achtervoegsel biedt een visuele aanwijzing in de uitvoer van de app die de bron van de configuratiewaarden aangeeft.
Geheime opslag in de productieomgeving met Azure Key Vault
Voer de volgende stappen uit om een Azure Key Vault te maken en de geheimen van de voorbeeld-app erin op te slaan. Zie de quickstart: Een geheim instellen en ophalen uit Azure Key Vault met behulp van Azure CLI voor meer informatie.
Open Azure Cloud Shell met behulp van een van de volgende methoden in Azure Portal:
- Selecteer Nu proberen in de rechterbovenhoek van een codeblok. Gebruik de zoekreeks 'Azure CLI' in het tekstvak.
- Open Cloud Shell in uw browser met de knop Cloud Shell starten .
- Selecteer de knop Cloud Shell in het menu in de rechterbovenhoek van Azure Portal.
Zie Azure CLI en overzicht van Azure Cloud Shell voor meer informatie.
Als u nog niet bent geverifieerd, meldt u zich aan met de
az loginopdracht.Maak een resourcegroep met de volgende opdracht, waarbij
{RESOURCE GROUP NAME}de naam van de nieuwe resourcegroep en{LOCATION}de Azure-regio is:az group create --name "{RESOURCE GROUP NAME}" --location {LOCATION}Maak een Sleutelkluis in de resourcegroep met de volgende opdracht, waarbij
{KEY VAULT NAME}de naam van de nieuwe kluis en{LOCATION}de Azure-regio is:az keyvault create --name {KEY VAULT NAME} --resource-group "{RESOURCE GROUP NAME}" --location {LOCATION}Maak geheimen in de kluis als naam-waardeparen.
Azure Key Vault-geheime namen zijn beperkt tot alfanumerieke tekens en streepjes. Hiërarchische waarden (configuratiesecties) maken gebruik van
--(twee streepjes) als scheidingsteken, aangezien dubbele punten niet zijn toegestaan in namen van Key Vault-geheimen. Dubbele punten scheiden een sectie van een subsleutel in ASP.NET Core-configuratie. De reeks met twee streepjes wordt vervangen door een dubbele punt wanneer de geheimen worden geladen in de instellingen van de app.De volgende geheimen zijn bedoeld voor gebruik met de voorbeeld-app. De waarden bevatten een
_prodachtervoegsel om deze te onderscheiden van de_devachtervoegselwaarden die in de ontwikkelomgeving zijn geladen vanuit Secret Manager. Vervang{KEY VAULT NAME}door de naam van de sleutelkluis die u in de vorige stap hebt gemaakt: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"
Toepassings-id en X.509-certificaat gebruiken voor niet-Door Azure gehoste apps
Configureer Azure Key Vault en de app voor het gebruik van een Microsoft Entra ID-toepassings-id en X.509-certificaat voor verificatie bij een kluis wanneer de app buiten Azure wordt gehost. Zie Over sleutels, geheimen en certificaten voor meer informatie.
Note
Hoewel het gebruik van een toepassings-id en X.509-certificaat wordt ondersteund voor apps die worden gehost in Azure, wordt dit niet aanbevolen. Gebruik in plaats daarvan beheerde identiteiten voor Azure-resources bij het hosten van een app in Azure. Voor beheerde identiteiten is het opslaan van een certificaat in de app of in de ontwikkelomgeving niet vereist.
De voorbeeld-app maakt gebruik van een toepassings-id en X.509-certificaat wanneer de preprocessor-instructie #define bovenaan Program.cs is ingesteld op Certificate.
- Maak een PKCS#12-archiefcertificaat (.pfx). Opties voor het maken van certificaten zijn New-SelfSignedCertificate in Windows en OpenSSL.
- Installeer het certificaat in het persoonlijke certificaatarchief van de huidige gebruiker. Het markeren van de sleutel als exporteerbaar is optioneel. Noteer de vingerafdruk van het certificaat, die later in dit proces wordt gebruikt.
- Exporteer het PKCS#12-archiefcertificaat (.pfx) als een DER-gecodeerd certificaat (.cer).
- Registreer de app bij Microsoft Entra ID (App-registraties).
- Upload het met DER gecodeerde certificaat (.cer) naar Microsoft Entra-id:
- Selecteer de app in Microsoft Entra ID.
- Navigeer naar Certificaten en geheimen.
- Selecteer Certificaat uploaden om het certificaat te uploaden, dat de openbare sleutel bevat. Een .cer-, PEM- of .crt-certificaat is acceptabel.
- Sla de sleutelkluisnaam, toepassings-id en certificaatvingerafdruk op in het
appsettings.jsonbestand van de app. - Navigeer naar Key Vaults in Azure Portal.
- Selecteer de Key Vault die u hebt gemaakt in de sectie Geheime opslag in de productieomgeving met Azure Key Vault.
- Selecteer Toegangsbeleid.
- Selecteer Toegangsbeleid toevoegen.
- Open geheime machtigingen en geef de app machtigingen voor Ophalen en Weergeven op.
- Selecteer Select principal en selecteer de geregistreerde app op naam. Selecteer de knop Selecteren.
- Kies OK.
- Selecteer Opslaan.
- De app implementeren.
De Certificate voorbeeld-app verkrijgt de configuratiewaarden vanuit IConfigurationRoot met dezelfde naam als de geheime naam:
- Niet-hiërarchische waarden: de waarde voor
SecretNamewordt verkregen metconfig["SecretName"]. - Hiërarchische waarden (secties): Gebruik
:de notatie (dubbele punt) of de GetSection methode. Gebruik een van deze methoden om de configuratiewaarde te verkrijgen:config["Section:SecretName"]config.GetSection("Section")["SecretName"]
Het X.509-certificaat wordt beheerd door het besturingssysteem. De app roept AddAzureKeyVault aan met waarden die zijn opgegeven door het appsettings.json bestand.
// 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>());
Voorbeeldwaarden:
- Key Vault-naam:
contosovault - Applicatie-ID:
00001111-aaaa-2222-bbbb-3333cccc4444 - Vingerafdruk van certificaat:
fe14593dd66b2406c5269d742d04b6e1ab03adb1
appsettings.json:
{
"KeyVaultName": "Key Vault Name",
"AzureADApplicationId": "Azure AD Application ID",
"AzureADCertThumbprint": "Azure AD Certificate Thumbprint",
"AzureADDirectoryId": "Azure AD Directory ID"
}
Wanneer u de app uitvoert, worden op een webpagina de geladen geheime waarden weergegeven. In de ontwikkelomgeving worden geheime waarden geladen met het _dev achtervoegsel. In de productieomgeving worden de waarden geladen met het _prod achtervoegsel.
Beheerde identiteiten gebruiken voor Azure-resources
Een app die in Azure is geïmplementeerd , kan profiteren van beheerde identiteiten voor Azure-resources. Met een beheerde identiteit kan de app worden geverifieerd met Azure Key Vault met behulp van Microsoft Entra ID-verificatie zonder referenties (toepassings-id en wachtwoord/clientgeheim) die zijn opgeslagen in de app.
De voorbeeld-app maakt gebruik van beheerde identiteiten voor Azure-resources wanneer de preprocessorrichtlijn aan het begin van #define is ingesteld op Program.cs.
Voer de kluisnaam in appsettings.json bestand van de app in. Voor de voorbeeld-app is geen toepassings-id en wachtwoord (clientgeheim) vereist wanneer deze is ingesteld op de Managed versie, zodat u deze configuratie-vermeldingen kunt negeren. De app wordt geïmplementeerd in Azure en Azure verifieert de app om alleen toegang te krijgen tot Azure Key Vault met behulp van de kluisnaam die in het appsettings.json bestand is opgeslagen.
Implementeer de voorbeeld-app in Azure App Service.
Een app die is geïmplementeerd in Azure App Service, wordt automatisch geregistreerd bij Microsoft Entra-id wanneer de service wordt gemaakt. Haal de object-id op uit de implementatie voor gebruik in de volgende opdracht. De object-id wordt weergegeven in Azure Portal in het Identity deelvenster van de App Service.
Gebruik Azure CLI en het object-id van de app om de app de list en get permissies te geven voor toegang tot de kluis.
az keyvault set-policy --name {KEY VAULT NAME} --object-id {OBJECT ID} --secret-permissions get list
Start de app opnieuw met behulp van Azure CLI, PowerShell of Azure Portal.
De voorbeeld-app:
- Hiermee maakt u een exemplaar van de DefaultAzureCredential klasse. De referentie probeert een toegangstoken te verkrijgen uit de omgeving voor Azure-resources.
- Er wordt een nieuwe SecretClient gemaakt door de
DefaultAzureCredentialinstantie. - Het
SecretClientexemplaar wordt gebruikt met een KeyVaultSecretManager exemplaar, waarmee geheime waarden worden geladen en dubbele streepjes (--) worden vervangen door dubbele puntjes (:) in sleutelnamen.
// 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
In het voorgaande voorbeeld wordt gebruikgemaakt DefaultAzureCredential van het vereenvoudigen van verificatie bij het ontwikkelen van apps die in Azure worden geïmplementeerd door referenties te combineren die worden gebruikt in Azure-hostingomgevingen met referenties die worden gebruikt in lokale ontwikkeling. Wanneer u overstapt op productie, is een alternatief een betere keuze, zoals ManagedIdentityCredential. Zie Azure-gehoste .NET-apps verifiëren bij Azure-resources met behulp van een door het systeem toegewezen beheerde identiteit voor meer informatie.
Voorbeeldwaarde van Key Vault-naam: contosovault
appsettings.json:
{
"KeyVaultName": "Key Vault Name"
}
Wanneer u de app uitvoert, worden op een webpagina de geladen geheime waarden weergegeven. In de ontwikkelomgeving hebben geheime waarden het _dev achtervoegsel omdat ze worden geleverd door Secret Manager. In de productieomgeving worden de waarden geladen met het _prod achtervoegsel omdat ze worden geleverd door Azure Key Vault.
Als er een Access denied fout optreedt, controleert u of de app is geregistreerd bij Microsoft Entra ID en toegang heeft gekregen tot de kluis. Controleer of u de service opnieuw hebt opgestart in Azure.
Zie Een Azure Resource Manager-serviceverbinding maken met een virtuele machine met een beheerde service-id voor meer informatie over het gebruik van de provider met een beheerde identiteit en Azure Pipelines.
Configuratieopties
AddAzureKeyVault kan een AzureKeyVaultConfigurationOptions object accepteren:
config.AddAzureKeyVault(
new SecretClient(
new Uri("Your Key Vault Endpoint"),
new DefaultAzureCredential(),
new AzureKeyVaultConfigurationOptions())
{
...
});
Note
In het voorgaande voorbeeld wordt gebruikgemaakt DefaultAzureCredential van het vereenvoudigen van verificatie bij het ontwikkelen van apps die in Azure worden geïmplementeerd door referenties te combineren die worden gebruikt in Azure-hostingomgevingen met referenties die worden gebruikt in lokale ontwikkeling. Wanneer u overstapt op productie, is een alternatief een betere keuze, zoals ManagedIdentityCredential. Zie Azure-gehoste .NET-apps verifiëren bij Azure-resources met behulp van een door het systeem toegewezen beheerde identiteit voor meer informatie.
Het AzureKeyVaultConfigurationOptions object bevat de volgende eigenschappen.
| Property | Description |
|---|---|
| Manager | KeyVaultSecretManager instantie die wordt gebruikt om het laden van geheimen te beheren. |
| ReloadInterval |
TimeSpan om te wachten tussen pogingen om de kluis op wijzigingen te controleren. De standaardwaarde is null (configuratie wordt niet opnieuw geladen). |
Een sleutelnaamvoorvoegsel gebruiken
AddAzureKeyVault biedt een overbelasting die een implementatie accepteert van KeyVaultSecretManager, waarmee u kunt bepalen hoe Key Vault-geheimen worden geconverteerd naar configuratiesleutels. U kunt bijvoorbeeld de interface implementeren om geheime waarden te laden op basis van een voorvoegselwaarde die u bij het opstarten van de app opgeeft. Met deze techniek kunt u bijvoorbeeld geheimen laden op basis van de versie van de app.
Warning
Gebruik geen voorvoegsels in Key Vault-geheimen om:
- Plaats geheimen voor meerdere apps in dezelfde kluis.
- Plaats omgevingsgeheimen (bijvoorbeeld ontwikkeling versus productiegeheimen ) in dezelfde kluis.
Verschillende apps en ontwikkel-/productieomgevingen moeten afzonderlijke Key Vaults gebruiken om app-omgevingen te isoleren voor het hoogste beveiligingsniveau.
In het volgende voorbeeld wordt een geheim tot stand gebracht in Key Vault (en het gebruik van Secret Manager voor de ontwikkelomgeving) voor 5000-AppSecret (perioden zijn niet toegestaan in sleutelkluisgeheimnamen). Dit geheim vertegenwoordigt een app-geheim voor versie 5.0.0.0 van de app. Voor een andere versie van de app, 5.1.0.0, wordt een geheim toegevoegd aan de kluis (en wordt Secret Manager gebruikt) voor 5100-AppSecret. Elke app-versie laadt zijn versiegebonden geheime waarde in de configuratie als AppSecret en verwijdert de versie bij het laden van het geheim.
AddAzureKeyVault wordt aangeroepen met een aangepaste KeyVaultSecretManager implementatie:
config.AddAzureKeyVault(
$"https://{builtConfig["KeyVaultName"]}.vault.azure.net/",
builtConfig["AzureADApplicationId"],
certs.OfType<X509Certificate2>().Single(),
new PrefixKeyVaultSecretManager(versionPrefix));
De implementatie reageert op de versievoorvoegsels van geheimen om het juiste geheim in de configuratie te laden:
-
Loadlaadt een geheim wanneer de naam begint met het voorvoegsel. Andere geheimen worden niet geladen. -
GetKey:- Hiermee verwijdert u het voorvoegsel uit de geheime naam.
- Vervangt twee streepjes in een naam door het
KeyDelimiter, dat het scheidingsteken is dat in de configuratie wordt gebruikt (meestal een dubbelpunt). Azure Key Vault staat geen dubbele punt toe in geheime namen.
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);
}
}
De Load methode wordt aangeroepen door een provider-algoritme dat de kluisgeheimen doorloopt om de geheimen met versievoorvoegsels te vinden. Wanneer een versieprefix wordt gevonden met Load, gebruikt het algoritme de GetKey-methode om de configuratienaam van de geheime sleutelnaam terug te geven. Hiermee wordt het versievoorvoegsel verwijderd uit de naam van het geheim. Het resterende deel van de geheime naam wordt geretourneerd voor het inladen in de naam-waardeparen van de configuratie van de app.
Wanneer deze aanpak wordt geïmplementeerd:
De versie van de app die is opgegeven in het projectbestand van de app. In het volgende voorbeeld is de versie van de app ingesteld op
5.0.0.0:<PropertyGroup> <Version>5.0.0.0</Version> </PropertyGroup>Controleer of een
<UserSecretsId>eigenschap aanwezig is in het projectbestand van de app, waarbij{GUID}een door de gebruiker opgegeven GUID is:<PropertyGroup> <UserSecretsId>{GUID}</UserSecretsId> </PropertyGroup>Sla de volgende geheimen lokaal op met 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"Geheimen worden opgeslagen in Azure Key Vault met behulp van de volgende Azure CLI-opdrachten:
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"Wanneer de app wordt uitgevoerd, worden de Key Vault-geheimen geladen. Het geheime reeks voor
5000-AppSecretkomt overeen met de versie van de app zoals gespecificeerd in het projectbestand van de app (5.0.0.0).De versie (
5000met het streepje) wordt verwijderd uit de sleutelnaam. Door de hele app laadt het lezen van de configuratie met de sleutelAppSecretde geheime waarde.Als de versie van de app wordt gewijzigd in het projectbestand naar
5.1.0.0en de app opnieuw wordt uitgevoerd, is de geretourneerde geheime waarde5.1.0.0_secret_value_devin de ontwikkelomgeving en5.1.0.0_secret_value_prodin Productie.
Note
U kunt ook uw eigen SecretClient-implementatie verschaffen aan AddAzureKeyVault. Met een aangepaste client kan één exemplaar van de client in de app worden gedeeld.
Een matrix binden aan een klasse
De provider kan configuratiewaarden lezen in een matrix voor binding met een POCO-matrix.
Bij het lezen van een configuratiebron waarmee sleutels dubbele puntscheidingstekens kunnen: bevatten, wordt een numeriek sleutelsegment gebruikt om onderscheid te maken tussen de sleutels waaruit een matrix bestaat (:0:, :1:... :{n}:). Zie Configuratie: Een matrix binden aan een klasse voor meer informatie.
Azure Key Vault-sleutels kunnen geen dubbele punt gebruiken als scheidingsteken. De benadering die in dit artikel wordt beschreven, gebruikt dubbele streepjes (--) als scheidingsteken voor hiërarchische waarden (secties). Matrixsleutels worden opgeslagen in Azure Key Vault met dubbele streepjes en numerieke sleutelsegmenten (--0--, --1--... --{n}--).
Bekijk de volgende configuratie van de Serilog-logboekregistratieprovider die wordt geleverd door een JSON-bestand. Er zijn twee letterlijke objectwaarden gedefinieerd in de WriteTo matrix die twee Serilog-sinks weerspiegelen, waarin bestemmingen voor logboekuitvoer worden beschreven:
"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=="
}
}
]
}
De configuratie die in het voorgaande JSON-bestand wordt weergegeven, wordt opgeslagen in Azure Key Vault met behulp van dubbele streepjesnotatie (--) en numerieke segmenten:
| 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== |
Geheimen opnieuw laden
Geheimen worden in de cache opgeslagen totdat IConfigurationRoot.Reload wordt aangeroepen. Vervolgens worden uitgeschakelde of bijgewerkte geheimen in de kluis pas door de app in acht genomen nadat de Reload is uitgevoerd.
Configuration.Reload();
Uitgeschakelde en verlopen geheimen
Verlopen geheimen worden standaard opgenomen in de configuratieprovider. Als u waarden voor deze geheimen in app-configuratie wilt uitsluiten, werkt u het verlopen geheim bij of geeft u de configuratie op met behulp van een aangepaste configuratieprovider:
class SampleKeyVaultSecretManager : KeyVaultSecretManager
{
public override bool Load(SecretProperties properties) =>
properties.ExpiresOn.HasValue &&
properties.ExpiresOn.Value > DateTimeOffset.Now;
}
Geef deze aangepaste KeyVaultSecretManager door aan AddAzureKeyVault:
// using Azure.Extensions.AspNetCore.Configuration.Secrets;
config.AddAzureKeyVault(
new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
new DefaultAzureCredential(),
new SampleKeyVaultSecretManager());
Uitgeschakelde geheimen kunnen niet worden opgehaald uit Key Vault en worden nooit opgenomen.
Note
In het voorgaande voorbeeld wordt gebruikgemaakt DefaultAzureCredential van het vereenvoudigen van verificatie bij het ontwikkelen van apps die in Azure worden geïmplementeerd door referenties te combineren die worden gebruikt in Azure-hostingomgevingen met referenties die worden gebruikt in lokale ontwikkeling. Wanneer u overstapt op productie, is een alternatief een betere keuze, zoals ManagedIdentityCredential. Zie Azure-gehoste .NET-apps verifiëren bij Azure-resources met behulp van een door het systeem toegewezen beheerde identiteit voor meer informatie.
Troubleshoot
Wanneer de app de configuratie niet kan laden met behulp van de provider, wordt er een foutbericht naar de ASP.NET Core Logging-infrastructuur geschreven. De volgende voorwaarden verhinderen dat de configuratie wordt geladen:
- De app of het certificaat is niet juist geconfigureerd in Microsoft Entra-id.
- De kluis bestaat niet in Azure Key Vault.
- De app is niet gemachtigd voor toegang tot de kluis.
- Het toegangsbeleid bevat de machtigingen
GetenListniet. - In de kluis zijn de configuratiegegevens (naam-waardepaar) onjuist benoemd, ontbreken ze of zijn ze uitgeschakeld.
- De app heeft de verkeerde Key Vault-naam (
KeyVaultName), de Microsoft Entra ID-toepassings-id (AzureADApplicationId) of de vingerafdruk van het Microsoft Entra ID-certificaat (AzureADCertThumbprint) of de map-id van Microsoft Entra ID (AzureADDirectoryId). - Bij het toevoegen van het Key Vault-toegangsbeleid voor de app is het beleid gemaakt, maar de knop Opslaan is niet geselecteerd in de gebruikersinterface voor toegangsbeleid .
Aanvullende bronnen
- Voorbeeldcode bekijken of downloaden (hoe download je)
- Configuratie in ASP.NET Core
- Documentatie voor Microsoft Azure: Key Vault
- Met HSM beveiligde sleutels genereren en overdragen voor Azure Key Vault
- Quickstart: Een geheim instellen en ophalen uit Azure Key Vault met behulp van een .NET-web-app
- Zelfstudie: Azure Key Vault gebruiken met Azure Windows Virtual Machine in .NET