Skip to content

Commit b3916ed

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

File tree

3 files changed

+55
-7
lines changed

3 files changed

+55
-7
lines changed

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: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.CommandLine;
22
using System.Text.Json;
3+
using Azure.Identity;
34
using EssentialCSharp.Chat.Common.Extensions;
45
using EssentialCSharp.Chat.Common.Services;
56
using Microsoft.Extensions.Configuration;
@@ -358,16 +359,61 @@ void WriteChunkingResult(FileChunkingResult result, TextWriter writer)
358359

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

0 commit comments

Comments
 (0)