4

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/

4

2 に答える 2