integrazione di .NET AspireAzure Key Vault
include integrazione dell'hosting e integrazione di
Client
Azure Key Vault è un servizio cloud per archiviare e accedere ai segreti in modo sicuro. L'integrazione .NET AspireAzure Key Vault consente di connettersi alle istanze di Azure Key Vault dalle applicazioni .NET.
Integrazione del servizio di hosting
L'integrazione di hosting Azure Key Vault modella una risorsa di Key Vault come tipo AzureKeyVaultResource. Per accedere a questi tipi e alle relative API all'interno del progetto dell'host dell'app , installare il pacchetto NuGet 📦Aspire.Hosting.Azure.KeyVault.
dotnet add package Aspire.Hosting.Azure.KeyVault
Per ulteriori informazioni, vedere dotnet add package oppure Gestisci le dipendenze dei pacchetti nelle applicazioni .NET.
Aggiungi la risorsa Azure Key Vault
Nel progetto host dell'app chiamare AddAzureKeyVault nell'istanza del generatore per aggiungere una risorsa Azure Key Vault:
var builder = DistributedApplication.CreateBuilder(args);
var keyVault = builder.AddAzureKeyVault("key-vault");
builder.AddProject<Projects.ExampleProject>()
.WithReference(keyVault);
// After adding all resources, run the app...
Il metodo WithReference configura una connessione nel ExampleProject
denominato "key-vault"
.
Importante
Per impostazione predefinita, AddAzureKeyVault
configura un ruolo di amministratore predefinito di Key Vault .
Consiglio
Quando si chiama AddAzureKeyVault, chiama in modo implicito AddAzureProvisioning, che aggiunge il supporto per la generazione di risorse Azure in modo dinamico durante l'avvio dell'app. L'app deve configurare l'abbonamento e la località appropriate. Per ulteriori informazioni, consultare Approvisionnement locale: Configurazione.
Generazione dell'approvvigionamento Bicep
Se sei nuovo a Bicep, si tratta di un linguaggio specifico per definire le risorse Azure. Con .NET.NET Aspire, non è necessario scrivere manualmente Bicep, poiché le API di provisioning generano automaticamente Bicep per te. Quando pubblichi la tua app, il Bicep generato viene visualizzato insieme al file manifesto. Quando si aggiunge una risorsa Azure Key Vault, viene generato il Bicep seguente:
@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location
param principalType string
param principalId string
resource key_vault 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: take('keyvault-${uniqueString(resourceGroup().id)}', 24)
location: location
properties: {
tenantId: tenant().tenantId
sku: {
family: 'A'
name: 'standard'
}
enableRbacAuthorization: true
}
tags: {
'aspire-resource-name': 'key-vault'
}
}
resource key_vault_KeyVaultAdministrator 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(key_vault.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '00482a5a-887f-4fb3-b363-3b7fe8e74483'))
properties: {
principalId: principalId
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '00482a5a-887f-4fb3-b363-3b7fe8e74483')
principalType: principalType
}
scope: key_vault
}
output vaultUri string = key_vault.properties.vaultUri
Il bicep precedente è un modulo che effettua il provisioning di una risorsa Azure Key Vault con le impostazioni predefinite seguenti:
-
location
: posizione del gruppo di risorse. -
principalId
: L'ID principale dell'utente o del servizio principale. -
principalType
: Il tipo principale dell'utente o del servizio principale. -
key_vault
: risorsa Azure Key Vault:-
name
: nome univoco per l'Azure Key Vault. -
properties
: proprietà Azure Key Vault:-
tenantId
: ID tenant del Azure Key Vault. -
sku
: SKU Azure Key Vault:-
family
: la famiglia di SKU. -
name
: il nome dello SKU.
-
-
enableRbacAuthorization
: valore booleano che indica se l'Azure Key Vault dispone dell'autorizzazione di controllo degli accessi in base al ruolo abilitata.
-
-
tags
: i tag di Azure Key Vault.
-
-
key_vault_KeyVaultAdministrator
: L'assegnazione del ruolo di amministratore Azure Key Vault-
name
: nome univoco per l'assegnazione di ruolo. -
properties
: Proprietà dell'assegnazione dei ruoli:-
principalId
: ID principale dell'utente o dell'entità servizio. -
roleDefinitionId
: ID della definizione del ruolo di amministratore Azure Key Vault. -
principalType
: Il tipo principale dell'utente o del servizio principale.
-
-
scope
: ambito dell'assegnazione di ruolo.
-
-
output
: URI di Azure Key Vault.
Il Bicep generato è un punto di partenza e può essere personalizzato per soddisfare i requisiti specifici.
Personalizzare l'infrastruttura di provisioning
Tutte le risorse .NET AspireAzure sono sottoclassi del tipo di AzureProvisioningResource. Questo tipo consente la personalizzazione del Bicep generato fornendo un'API fluente per configurare le risorse Azure usando l'API ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>). Ad esempio, è possibile configurare il sku
, RBAC
, tags
e altro ancora. L'esempio seguente illustra come personalizzare la risorsa Azure Key Vault:
builder.AddAzureKeyVault("key-vault")
.ConfigureInfrastructure(infra =>
{
var keyVault = infra.GetProvisionableResources()
.OfType<KeyVaultService>()
.Single();
keyVault.Properties.Sku = new()
{
Family = KeyVaultSkuFamily.A,
Name = KeyVaultSkuName.Premium,
};
keyVault.Properties.EnableRbacAuthorization = true;
keyVault.Tags.Add("ExampleKey", "Example value");
});
Il codice precedente:
- Concatena una chiamata all'API ConfigureInfrastructure:
- Il parametro
infra
è un'istanza del tipo AzureResourceInfrastructure. - Le risorse provisionabili si recuperano chiamando il metodo GetProvisionableResources().
- Viene recuperata la singola risorsa KeyVaultService.
- La proprietà
Sku
è impostata su una nuova istanza di KeyVaultSku. - La proprietà KeyVaultProperties.EnableRbacAuthorization è impostata su
true
. - Alla risorsa viene aggiunto un tag con una chiave di
ExampleKey
e un valore diExample value
.
- Il parametro
Sono disponibili molte altre opzioni di configurazione per personalizzare la risorsa Key Vault. Per ulteriori informazioni, vedere
Collegarsi a un'istanza di Azure Key Vault esistente
Potrebbe essere disponibile un'istanza di Azure Key Vault esistente a cui connettersi. Anziché rappresentare una nuova risorsa Azure Key Vault, è possibile aggiungere una stringa di connessione all'host dell'app. Per aggiungere una connessione a una risorsa di Azure Key Vault esistente, chiamare il metodo AddConnectionString:
var builder = DistributedApplication.CreateBuilder(args);
var keyVault = builder.AddConnectionString("key-vault");
builder.AddProject<Projects.WebApplication>("web")
.WithReference(keyVault);
// After adding all resources, run the app...
Nota
Le stringhe di connessione vengono usate per rappresentare un'ampia gamma di informazioni di connessione, tra cui connessioni di database, broker di messaggi, URI degli endpoint e altri servizi. Nella nomenclatura .NET.NET Aspire, il termine "stringa di connessione" è utilizzato per rappresentare qualsiasi tipo di informazioni di connessione.
La stringa di connessione viene configurata nella configurazione dell'host dell'app, in genere sotto User Secrets, nella sezione ConnectionStrings
. L'host dell'app inserisce questa stringa di connessione come variabile di ambiente in tutte le risorse dipendenti, ad esempio:
{
"ConnectionStrings": {
"key-vault": "https://{account_name}.vault.azure.net/"
}
}
La risorsa dipendente può accedere alla stringa di connessione inserita chiamando il metodo GetConnectionString e passando il nome della connessione come parametro, in questo caso "key-vault"
. L'API GetConnectionString
è un'abbreviazione di IConfiguration.GetSection("ConnectionStrings")[name]
.
integrazione Client
Per iniziare a usare l'integrazione client .NET AspireAzure Key Vault, installare il pacchetto NuGet 📦Aspire.Azure. Security.KeyVault nel progetto che consuma il client, ovvero il progetto per l'applicazione che utilizza il client Azure Key Vault.
dotnet add package Aspire.Azure.Security.KeyVault
L'integrazione del client offre due modi per accedere ai segreti da Azure Key Vault:
- Aggiungere segreti alla configurazione dell'app usando il pattern
IConfiguration
oIOptions<T>
. - Usa un
SecretClient
per recuperare i segreti a richiesta.
Aggiungere segreti alla configurazione
Nel file Program.cs del progetto cliente, chiama il metodo di estensione AddAzureKeyVaultSecrets su IConfiguration per aggiungere i segreti nella configurazione dell'app. Il metodo accetta un parametro del nome di connessione.
builder.Configuration.AddAzureKeyVaultSecrets(connectionName: "key-vault");
Nota
Il nome dell'API AddAzureKeyVaultSecrets
ha causato un po' di confusione. Il metodo viene usato per configurare il SecretClient
in base al nome di connessione specificato e non viene usato per aggiungere segreti alla configurazione.
Consiglio
Il parametro connectionName
deve corrispondere al nome usato quando si aggiunge la risorsa Azure Key Vault nel progetto host dell'app. Per altre informazioni, vedere Aggiungere Azure Key Vault risorsa.
È quindi possibile recuperare un valore di configurazione basato su segreto tramite le normali API di IConfiguration o anche tramite l'associazione a classi fortemente tipate con il modello di opzioni . Per recuperare un segreto da una classe di servizio di esempio registrata con il contenitore di iniezione delle dipendenze, considera i frammenti di codice seguenti:
Recuperare l'istanza IConfiguration
public class ExampleService(IConfiguration configuration)
{
// Use configuration...
private string _secretValue = configuration["SecretKey"];
}
Nell'esempio precedente si presuppone che sia stata registrata anche l'istanza di IConfiguration
per l'iniezione delle dipendenze. Per altre informazioni, vedere iniezione delle dipendenze in .NET.
Recuperare l'istanza IOptions<T>
public class ExampleService(IOptions<SecretOptions> options)
{
// Use options...
private string _secretValue = options.Value.SecretKey;
}
L'esempio precedente presuppone che sia stata configurata una classe SecretOptions
da usare con il modello di opzioni. Per altre informazioni, vedere Modello opzioni in .NET.
Altri parametri api AddAzureKeyVaultSecrets
sono disponibili facoltativamente per gli scenari seguenti:
-
Action<AzureSecurityKeyVaultSettings>? configureSettings
: per configurare alcune o tutte le opzioni inline. -
Action<SecretClientOptions>? configureClientOptions
: per configurare il SecretClientOptions inline. -
AzureKeyVaultConfigurationOptions? options
: per configurare il AzureKeyVaultConfigurationOptions inline.
Aggiungere un client segreto Azure
In alternativa, è possibile usare il SecretClient direttamente per recuperare i segreti su richiesta. Ciò richiede un'API di registrazione leggermente diversa.
Nel file Program.cs del progetto che utilizza il client, chiama l'estensione AddAzureKeyVaultClient sull'istanza IHostApplicationBuilder per registrare un SecretClient
da utilizzare tramite il contenitore per l'inserimento delle dipendenze.
builder.AddAzureKeyVaultClient(connectionName: "key-vault");
Consiglio
Il parametro connectionName
deve corrispondere al nome usato quando si aggiunge la risorsa Azure Key Vault nel progetto host dell'app. Per altre informazioni, vedere Aggiungere Azure Key Vault risorsa.
Dopo aver aggiunto il *SecretClient
* al *builder*, è possibile ottenere l'istanza di *SecretClient* usando il *dependency injection*. Ad esempio, per recuperare il client da un servizio di esempio, definirlo come parametro del costruttore e assicurarsi che la classe ExampleService
sia registrata con il contenitore di inserimento delle dipendenze:
public class ExampleService(SecretClient client)
{
// Use client...
}
Per ulteriori informazioni sull'iniezione di dipendenze, vedere .NET iniezione di dipendenze.
Aggiungere un cliente con chiave Azure Key Vault
In alcuni casi potrebbe essere necessario registrare più istanze di SecretClient
con nomi di connessione diversi. Per registrare i client Azure Key Vault con chiave, chiamare il metodo AddKeyedAzureKeyVaultClient:
builder.AddKeyedAzureKeyVaultClient(name: "feature-toggles");
builder.AddKeyedAzureKeyVaultClient(name: "admin-portal");
È quindi possibile recuperare le istanze SecretClient
usando l'iniezione di dipendenze. Ad esempio, per recuperare il client da un servizio di esempio:
public class ExampleService(
[FromKeyedServices("feature-toggles")] SecretClient featureTogglesClient,
[FromKeyedServices("admin-portal")] SecretClient adminPortalClient)
{
// Use clients...
}
Per ulteriori informazioni sui servizi con chiave, consultare la sezione .NET Inserimento delle Dipendenze: Servizi con Chiave.
Configurazione
L'integrazione .NET AspireAzure Key Vault offre più opzioni per configurare l'SecretClient
in base ai requisiti e alle convenzioni del progetto.
Usare i Provider di Configurazione
L'integrazione .NET AspireAzure Key Vault supporta Microsoft.Extensions.Configuration. Carica il AzureSecurityKeyVaultSettings da appsettings.json o da altri file di configurazione usando la chiave Aspire:Azure:Security:KeyVault
.
{
"Aspire": {
"Azure": {
"Security": {
"KeyVault": {
"DisableHealthChecks": true,
"DisableTracing": false,
"ClientOptions": {
"Diagnostics": {
"ApplicationId": "myapp"
}
}
}
}
}
}
}
Per lo schema di integrazione client completo Azure Key VaultJSON, vedere Aspire.Azure. Security.KeyVault/ConfigurationSchema.json.
Se sono state configurate le configurazioni nella sezione Aspire:Azure:Security:KeyVault
del file di appsettings.json, è sufficiente chiamare il metodo AddAzureKeyVaultSecrets
senza passare alcun parametro.
Usare delegati inline
È anche possibile passare il delegato Action<AzureSecurityKeyVaultSettings>
per configurare alcune o tutte le opzioni direttamente, ad esempio per definire il AzureSecurityKeyVaultSettings.VaultUri:
builder.AddAzureKeyVaultSecrets(
connectionName: "key-vault",
configureSettings: settings => settings.VaultUri = new Uri("KEY_VAULT_URI"));
È anche possibile configurare il SecretClientOptions usando il delegato Action<SecretClientOptions>
, che è un parametro facoltativo della funzione AddAzureKeyVaultSecrets
. Ad esempio, per impostare l'ID KeyClientOptions.DisableChallengeResourceVerification per identificare il client:
builder.AddAzureKeyVaultSecrets(
connectionName: "key-vault",
configureClientOptions: options => options.DisableChallengeResourceVerification = true))
Opzioni di configurazione
Le opzioni configurabili seguenti vengono esposte tramite la classe AzureSecurityKeyVaultSettings:
Nome | Descrizione |
---|---|
AzureSecurityKeyVaultSettings.Credential | La credenziale usata per eseguire l'autenticazione al Azure Key Vault. |
AzureSecurityKeyVaultSettings.DisableHealthChecks | Valore booleano che indica se la verifica dello stato del Key Vault è disabilitata o meno. |
AzureSecurityKeyVaultSettings.DisableTracing | Valore booleano che indica se la traccia OpenTelemetry è disabilitata o meno. |
AzureSecurityKeyVaultSettings.VaultUri | URI del caveau su cui opera il client. Viene visualizzato come "Nome DNS" nel portale di Azure. |
Client verifiche di integrità dell'integrazione
Per impostazione predefinita, le integrazioni client .NET.NET Aspire hanno i controlli di integrità abilitati per tutti i servizi. Analogamente, molte integrazioni di hosting .NET.NET Aspire abilitano anche gli endpoint di controllo dell'integrità. Per altre informazioni, vedere:
- controlli di integrità dell'app .NET in C#
- controlli di integrità in ASP.NET Core
L'integrazione .NET AspireAzure Key Vault include le verifiche dello stato di salute seguenti:
- Aggiunge il controllo di integrità
AzureKeyVaultSecretsHealthCheck
, che prova a connettersi ed eseguire query sul Key Vault - Si integra con l'endpoint HTTP
/health
, che specifica che tutti i controlli di integrità registrati devono essere passati affinché l'app sia considerata pronta ad accettare il traffico
Osservabilità e telemetria
.NET
.NET Aspire le integrazioni configurano automaticamente i log, il tracciamento e le metriche, talvolta noti come i pilastri dell'osservabilità. Per altre informazioni sull'osservabilità e la telemetria dell'integrazione, vedere panoramica delle integrazioni .NET.NET Aspire. A seconda del servizio di backup, alcune integrazioni possono supportare solo alcune di queste funzionalità. Ad esempio, alcune integrazioni supportano la registrazione e la traccia, ma non le metriche. Le funzionalità di telemetria possono essere disabilitate anche usando le tecniche presentate nella sezione Configurazione
Registrazione
L'integrazione .NET AspireAzure Key Vault usa le categorie di log seguenti:
Azure.Core
Azure.Identity
Tracciamento
L'integrazione .NET AspireAzure Key Vault genererà le attività di traccia seguenti usando OpenTelemetry:
Azure.Security.KeyVault.Secrets.SecretClient
Metriche
L'integrazione .NET AspireAzure Key Vault attualmente non supporta le metriche per impostazione predefinita a causa di limitazioni con Azure SDK.
Vedere anche
- Azure Key Vault docs
- Video: Introduzione a Azure Key Vault e .NET Aspire
- Panoramica integrazioni .NET AspireAzure
- Panoramica integrazioni .NET.NET Aspire
- .NET Aspire GitHub repository