@@ -358,16 +358,61 @@ void WriteChunkingResult(FileChunkingResult result, TextWriter writer)
358358
359359 /// <summary>
360360 /// Creates and configures the IConfiguration used by multiple commands.
361- /// This method centralizes the common configuration setup to reduce code duplication .
361+ /// Supports Azure Key Vault integration for secure secret management .
362362 /// </summary>
363363 /// <returns>The configured IConfigurationRoot</returns>
364+ /// <remarks>
365+ /// Configuration precedence (highest to lowest):
366+ /// 1. Environment Variables
367+ /// 2. Azure Key Vault (if configured)
368+ /// 3. User Secrets (development only)
369+ /// 4. appsettings.json
370+ ///
371+ /// To enable Key Vault, set the "KeyVaultName" configuration value in appsettings.json or user secrets:
372+ /// {
373+ /// "KeyVaultName": "your-keyvault-name"
374+ /// }
375+ ///
376+ /// The application will use DefaultAzureCredential for authentication, which supports:
377+ /// - Managed Identity (in Azure)
378+ /// - Azure CLI (local development)
379+ /// - Visual Studio (local development)
380+ /// - Environment variables (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID)
381+ /// </remarks>
364382 private static IConfigurationRoot CreateConfiguration ( )
365383 {
366- return new ConfigurationBuilder ( )
384+ var configBuilder = new ConfigurationBuilder ( )
367385 . SetBasePath ( IntelliTect . Multitool . RepositoryPaths . GetDefaultRepoRoot ( ) )
368- . AddJsonFile ( "EssentialCSharp.Web/appsettings.json" )
369- . AddUserSecrets < Program > ( )
370- . AddEnvironmentVariables ( )
371- . Build ( ) ;
386+ . AddJsonFile ( "EssentialCSharp.Web/appsettings.json" , optional : false , reloadOnChange : true )
387+ . AddJsonFile ( $ "EssentialCSharp.Web/appsettings.{ Environment . GetEnvironmentVariable ( "ASPNETCORE_ENVIRONMENT" ) ?? "Production" } .json", optional : true , reloadOnChange : true )
388+ . AddUserSecrets < Program > ( optional : true )
389+ . AddEnvironmentVariables ( ) ;
390+
391+ // Build a temporary configuration to check for Key Vault settings
392+ var tempConfig = configBuilder . Build ( ) ;
393+ var keyVaultName = tempConfig [ "KeyVaultName" ] ;
394+
395+ // If Key Vault is configured, add it to the configuration pipeline
396+ if ( ! string . IsNullOrEmpty ( keyVaultName ) )
397+ {
398+ try
399+ {
400+ var keyVaultUri = new Uri ( $ "https://{ keyVaultName } .vault.azure.net/") ;
401+
402+ // Use DefaultAzureCredential which works both locally and in Azure
403+ var credential = new DefaultAzureCredential ( ) ;
404+
405+ configBuilder . AddAzureKeyVault ( keyVaultUri , credential ) ;
406+
407+ Console . WriteLine ( $ "✅ Connected to Azure Key Vault: { keyVaultName } ") ;
408+ }
409+ catch ( Exception ex )
410+ {
411+ Console . WriteLine ( $ "⚠️ Warning: Could not connect to Azure Key Vault '{ keyVaultName } ': { ex . Message } ") ;
412+ Console . WriteLine ( " Continuing with other configuration sources..." ) ;
413+ }
414+ }
415+
416+ return configBuilder . Build ( ) ;
372417 }
373418}
0 commit comments