Skip to content

Commit e44137b

Browse files
Add key vault abilities
1 parent 6bfb7cc commit e44137b

3 files changed

Lines changed: 54 additions & 7 deletions

File tree

Directory.Packages.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
</ItemGroup>
1818
<ItemGroup>
1919
<PackageVersion Include="AspNet.Security.OAuth.GitHub" Version="8.3.0" />
20+
<PackageVersion Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.4.0" />
2021
<PackageVersion Include="Azure.Identity" Version="1.12.1" />
2122
<PackageVersion Include="Azure.Monitor.OpenTelemetry.AspNetCore" Version="1.3.0" />
2223
<PackageVersion Include="Microsoft.ApplicationInsights.Profiler.AspNetCore" Version="2.6.0" />
@@ -51,4 +52,4 @@
5152
<PackageVersion Include="xunit" Version="2.9.3" />
5253
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.1" />
5354
</ItemGroup>
54-
</Project>
55+
</Project>

EssentialCSharp.Chat/EssentialCSharp.Chat.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
</PropertyGroup>
1919

2020
<ItemGroup>
21+
<PackageReference Include="Azure.Extensions.AspNetCore.Configuration.Secrets" />
2122
<PackageReference Include="Microsoft.SemanticKernel" />
2223
<PackageReference Include="Microsoft.SemanticKernel.Connectors.PgVector" />
2324
<PackageReference Include="ModelContextProtocol" />

EssentialCSharp.Chat/Program.cs

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)