我試圖使用Azure密鑰保管庫來存儲我的實體框架的web api連接字符串。理想情況下,我想避免將密鑰庫nuget包與我的數據訪問代碼結合在一起。我的DbContext類有兩個構造函數:具有實體框架「DefaultConnection」應用程序設置的Azure密鑰保險庫
public MyDbContext() : base("DefaultConnection")
{ . . . }
public MyDbContext(string connectionString) : base(connectionString)
{ . . . }
我的代碼使用參數的構造函數後者從web配置的連接字符串。有一些地方我實例化一個新的MyDbContext對象,它禁止使用注入的解決方案。
我所走的路線是建立在我的DbContext的靜態屬性與連接字符串定位:
public interface IConnectionStringLocator
{ string Get(); }
public class DefaultConnectionStringLocator : IConnectionStringLocator
{
public string Get()
{
return "DefaultConnection";
}
}
public static IConnectionStringLocator ConnectionStringLocator { get; set; } =
new DefaultConnectionStringLocator();
我的網頁API項目具有的NuGet包檢索關鍵金庫的祕密。所以在我的Global.asax文件我有這樣的:
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;
}
}
}
我出版這和它的作品,但它並沒有「感覺」的權利。
另一種選擇是遵循這篇文章https://blog.falafel.com/keeping-secrets-with-azure-key-vault/,但它需要我將KeyVault API包與我的數據訪問結合起來。
我在尋找反饋和方向。我應該補充一點,我想使用密鑰保管庫的原因是,它允許我有天藍色的管理員,他們可以在線查看應用程序設置,而無需通過連接字符串訪問sql數據庫。新MSI實現
KeyVault資源:https://github.com/Azure-Samples/app-service-msi-keyvault-dotnet/