Ich versuche, Azure Key Vault zum Speichern meiner Web-API-Verbindungszeichenfolgen für Entity Framework zu verwenden. Im Idealfall möchte ich vermeiden, die Key-Vault-Nuget-Pakete mit meinem Datenzugriffscode zu koppeln. Meine DbContext Klasse hat zwei Konstruktoren:Azure Key Vault mit Entity Framework App-Einstellung "DefaultConnection"
public MyDbContext() : base("DefaultConnection")
{ . . . }
public MyDbContext(string connectionString) : base(connectionString)
{ . . . }
Mein Code Verwendung des parameterlosen Konstruktor macht, die die Verbindungszeichenfolge aus dem Web-Config wird. Es gibt einige Stellen, wo ich ein neues MyDbContext-Objekt instanziiere, das eine Lösung verhindert, die Injektion verwendet.
Die Route, die ich nahm, ist eine statische Eigenschaft auf meinem DbContext mit einem Verbindungszeichenfolge-Locator einzustellen:
public interface IConnectionStringLocator
{ string Get(); }
public class DefaultConnectionStringLocator : IConnectionStringLocator
{
public string Get()
{
return "DefaultConnection";
}
}
public static IConnectionStringLocator ConnectionStringLocator { get; set; } =
new DefaultConnectionStringLocator();
Mein Web api Projekt hat die nuget Pakete für die wichtigsten Gewölbe Geheimnisse abruft. Also in meinem Global.asax-Datei habe ich dies:
protected void Application_Start()
{
MyDbContext.ConnectionStringLocator = new ConnectionStringLocator("DefaultConnection");
}
public class ConnectionStringLocator : IConnectionStringLocator
{
private readonly string _connectionStringName;
public ConnectionStringLocator(string connectionStringName)
{
this._connectionStringName = connectionStringName;
}
public string Get()
{
var keyVaultName = WebConfigurationManager.AppSettings.Get("KeyVaultName");
if (keyVaultName == "develop")
return _connectionStringName;
else
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient =
new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var defaultConnectionSecret =
keyVaultClient.GetSecretAsync($"https://{keyVaultName}.vault.azure.net/secrets/{this._connectionStringName}");
return defaultConnectionSecret.Result.Value;
}
}
}
ich diese veröffentlicht und es funktioniert, aber es funktioniert nicht „fühlen“ rechts.
Eine andere Möglichkeit wäre, diesem Artikel https://blog.falafel.com/keeping-secrets-with-azure-key-vault/ zu folgen, aber ich würde die KeyVault-API-Pakete mit meinem Datenzugriff verbinden müssen.
Ich bin auf der Suche nach Feedback und Richtung. Ich sollte hinzufügen, dass der Grund, warum ich den Schlüsseltresor verwenden möchte, darin besteht, dass ich Azure-Administratoren haben kann, die die Anwendungseinstellungen online sehen können, ohne über die Verbindungszeichenfolge Zugriff auf die SQL-Datenbank zu haben.
KeyVault Ressource mit der neuen MSI Implementierung: https://github.com/Azure-Samples/app-service-msi-keyvault-dotnet/