Gestire dati sensibili nella configurazione in ASP.NET Core

di Marco De Sanctis, in ASP.NET Core,

Come sviluppatori, dobbiamo porre estrema attenzione a come gestire dati sensibili, come password, API Key o stringhe di connessione al database: aggiungere queste informazioni al file appsettings.json, per esempio, per poi magari pubblicare il nostro codice su un repository pubblico come GitHub espone a ovvi rischi - soprattutto per il fatto che, tramite history, è possibile recuperarli anche se sono stati eliminati dalla versione corrente del codice.

In linea generale, questi dati dovrebbero sempre restare confinati nell'ambiente di sviluppo, e magari salvati in una location del nostro disco differente da quella del progetto vero e proprio.

Fortunatamente, .NET SDK e Visual Studio dispongono di uno strumento per risolvere questo problema alla base, e in maniera del tutto trasparente per l'utente: Secret Manager.

Per prima cosa, dobbiamo attivare questa funzionalità sul progetto .NET. Tramite DotNet CLI possiamo invocare il metodo Init del modulo user-secrets:

dotnet user-secrets init

Se invece siamo in Visual Studio, ci basta selezionare l'opzione Manage User Secrets sul menu contestuale del progetto:


A questo punto, ciò che accade dietro le quinte è che viene creato un file JSON nella directory

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\

e questo identificativo viene successivamente memorizzato nel file di progetto nella proprietà UserSecretsId:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>2e44673f-d3b7-45ba-bb62-6769880247f0</UserSecretsId>
  </PropertyGroup>

  ...

</Project>

Secrets.json funziona alla stessa stregua di appsettings.json, pertanto possiamo editarlo direttamente in Visual Studio per aggiungere le nostre informazioni sensibili.

Alternativamente, possiamo anche aggiungere chiavi tramite DotNet CLI:

dotnet user-secrets set "Database:ConnectionString" "...."

Quando avviamo l'applicazione, se l'host environment è Development, il default builder effettuerà in automatico il merge di Secrets.json con appsettings.json, così che, dal nostro punto di vista, sarà possibile accedere a questi valori sensibili esattamente come tutti gli altri dati di configurazione:

public class WeatherForecastController : ControllerBase
{
    private IConfiguration _config;

    public WeatherForecastController(IConfiguration config)
    {
        _config = config;
    }

    [HttpGet]
    public string Get()
    {
        var connectionString = _config["Database:ConnectionString"];
        using var connection = new SqlConnection(connectionString);
        ....
    }
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi