Search code examples
c#asp.net-coreasp-net-config-builders

Using ConfigurationBuilder to read setting and use AddAzureKeyVault


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;
    }

Solution

  • 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.