Ciao,
il fatto di inserire le chiavi in un file json, seppur flessibile, mi sembra un sistema a dir poco non sicuro in ambiente di produzione
Puoi spiegare come mai? A livello di sicurezza, mi sembra equivalente all'usare il vecchio web.config o le variabili d'ambiente. Le chiavi sono ugualmente al sicuro, a meno che ovviamente qualche utente non autorizzato non riesca ad accedere al server.
Il tuo scopo per proteggere tali chiavi qual è?
- Ci sono più sviluppatori in questo progetto e non vuoi che usino le tue chiavi personali?
- Si tratta di un progetto open source e non vuoi che vengano committate nel repository pubblico?
Secondo me potresti
definire le chiavi nell'appsettings.json e valorizzarle con stringhe tipo "Metti qui la tua connection string all'Azure Service Bus" e poi, di fatto ne imposti il valore usando il secret manager tool descritto nella documentazione:
https://docs.asp.net/en/latest/security/app-secrets.htmlI valori impostati in questo modo andranno a sovrascrivere quelli dell'appsettings.json.
In questo modo i valori delle tue chiavi non andranno a finire in alcun file del progetto, ma saranno archiviati nella cartella App_Data del tuo utente Windows. E' un buon sistema per gestire i valori delle chiavi durante lo sviluppo.
La rilettura di questi valori è in questo modo 'unificata' tra sviluppo e produzione, senza files o codice differente?
Mmmh, che intendi? Se guardi il codice del tuo metodo Startup avrai qualcosa del genere:
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsDevelopment())
{
// For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
Vedi quindi che l'oggetto ConfigurationBuilder viene "popolato" di fonti da cui è possibile ottenere valori per le varie chiavi di configurazione. L'ordine è importante, quindi la presenza di una variabile d'ambiente è più prioritaria (cioè sovrascrive) del valore impostato tramite il Secret Manager Tool che, a sua volta, è più prioritario dei file json.
In questo modo, per un altro sviluppatore che usa il tuo sorgente, è molto facile andare a definire i valori nel modo che gli sembra più consono, dato che hai configurato varie fonti da cui poterli attingere.
ciao,
Moreno