Entity Framework の Web API 接続文字列を格納するために Azure Key Vault を使用しようとしています。理想的には、キー コンテナーのナゲット パッケージをデータ アクセス コードと結合することは避けたいと考えています。私の dbContext クラスには 2 つのコンストラクターがあります。
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();
私の Web 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 パッケージとデータ アクセスを組み合わせる必要があります。
フィードバックと方向性を探しています。Key Vault を使用する理由は、接続文字列を介して SQL データベースにアクセスしなくてもアプリケーション設定をオンラインで表示できる Azure 管理者を持つことができるためです。
新しい MSI 実装を使用した KeyVault リソース: https://github.com/Azure-Samples/app-service-msi-keyvault-dotnet/