Using ConfigurationBuilder to read setting and use AddAzureKeyVault

66 Views Asked by At

I have the following but in order to use AddAzureKeyVault I need to know the key vault name which is set in configuration. Is it possible to read in this value in one go or do I need to build it twice?

    private static IConfigurationRoot GetIConfigurationRoot()
    {
        var root = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false)
            //.AddAzureKeyVault($"https://{keyVaultName}.vault.azure.net")
            .AddEnvironmentVariables()
            .Build();
                
        return root;
    }
2

There are 2 best solutions below

0
On BEST ANSWER

Not sure why do you add your configuration like that, but it is possible in with ConfigurationManager for example :

var builder = WebApplication.CreateBuilder(args);
var connStringAzureKV= builder.Configuration.GetConnectionString("AzureKV");
builder.Configuration.AddAzureKeyVault(connStringAzureKV);

Or

var configurationManager = new ConfigurationManager();
configurationManager.SetBasePath(Directory.GetCurrentDirectory());
configurationManager.AddJsonFile("appsettings.json");
var connStringAzureKV = configurationManager.GetConnectionString("AzureKV");
configurationManager.AddAzureKeyVault(connStringAzureKV);

ConfigurationManager implements both IConfigurationManager and IConfigurationRoot, so it should work in your case.

Not sure what kind of host are you building, but using the first example is always good option.

When you build your IConfigurationRoot I don't see a way to add more configuration sources.

NOTE This is also valid:

public static IConfigurationRoot GetIConfigurationRoot()
 {
     var configurationManager = new ConfigurationManager();
     configurationManager.SetBasePath(Directory.GetCurrentDirectory());
     configurationManager.AddJsonFile("appsettings.json");
     var connStringAzureKV = configurationManager.GetConnectionString("AzureKV");
     configurationManager.AddAzureKeyVault(connStringAzureKV);

     return configurationManager;
 }

I used GetConnectionString just for sake of example, you can get your configuration from every section in appsettings.json.

0
On

You should be able to add azure key vault configuration after build.

private static IConfigurationRoot GetIConfigurationRoot()
{
    var builder = new ConfigurationBuilder();
    var root = builder
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false)
            .AddEnvironmentVariables()
            .Build();
    builder.AddAzureKeyVault($"https://{root["AzureKeyVault:Name"]}.vault.azure.net");
    return root;
}