Azure configuration abstractions for .NET applications. Includes AppTokenCredential for cloud/local authentication, Key Vault reference replacement, and configuration validation with data annotations.
$ dotnet add package Imagile.Framework.ConfigurationAzure configuration abstractions for .NET applications. Provides seamless integration with Azure Key Vault, automatic credential management for cloud and local development, and comprehensive configuration validation.
dotnet add package Imagile.Framework.Configuration
using Imagile.Framework.Configuration.Extensions;
var builder = WebApplication.CreateBuilder(args);
// One-line setup: Key Vault + Validation
builder.Services.AddFrameworkConfiguration(builder.Configuration, config => config
.WithKeyVault(new Uri("https://myvault.vault.azure.net/"))
.WithValidation());
var app = builder.Build();
app.Run();
Automatically selects the appropriate Azure authentication method based on environment:
Cloud (Azure):
Local Development:
No code changes needed when moving between environments.
Store secrets in Azure Key Vault and reference them in configuration using @KeyVault(SecretName) syntax:
appsettings.json:
{
"Database": {
"Host": "localhost",
"Password": "@KeyVault(DbPassword)"
},
"Api": {
"Key": "@KeyVault(ApiKey)"
}
}
The framework automatically replaces these references with actual secret values from Key Vault at startup.
Validate configuration using data annotations with recursive validation and aggregated error messages:
public class DatabaseSettings
{
[Required]
public string Host { get; set; } = string.Empty;
[Range(1, 65535)]
public int Port { get; set; }
[Required]
public RetrySettings Retry { get; set; } = null!;
}
public class RetrySettings
{
[Range(0, 10)]
public int MaxAttempts { get; set; }
}
// Validate configuration
var settings = configuration.Get<DatabaseSettings>()!;
settings.ValidateRecursively(); // Throws ConfigurationValidationException with all errors
builder.Services.AddFrameworkConfiguration(builder.Configuration, config => config
.WithKeyVault(new Uri("https://myvault.vault.azure.net/")));
builder.Services.AddFrameworkConfiguration(builder.Configuration, config => config
.WithKeyVault(
new Uri("https://myvault.vault.azure.net/"),
builder.Configuration["AzureManagedIdentityClientId"])
.WithValidation());
// Create credential
var credential = new AppTokenCredential(managedIdentityClientId: null); // null = local dev
builder.Services.AddSingleton<TokenCredential>(credential);
// Create Secret Client
var keyVaultUri = new Uri(builder.Configuration["Azure:KeyVaultUrl"]!);
var secretClient = new SecretClient(keyVaultUri, credential);
builder.Services.AddSingleton(secretClient);
// Replace Key Vault references
builder.Configuration.ReplaceKeyVaultReferences(secretClient);
// Validate configuration
var appSettings = builder.Configuration.Get<AppSettings>()!;
appSettings.ValidateRecursively();
builder.Services.AddFrameworkConfiguration(builder.Configuration, config => config
.WithValidation());
AddFrameworkConfiguration(IServiceCollection, IConfiguration, Action<FrameworkConfigurationBuilder>)
Primary entry point for configuring Framework Configuration features.WithKeyVault(Uri keyVaultUri, string? managedIdentityClientId = null)
Enable Key Vault integration with automatic reference replacement.
WithKeyVault(string keyVaultUrl, string? managedIdentityClientId = null)
Enable Key Vault integration using string URL.
WithValidation()
Enable configuration validation using data annotations.
ValidateRecursively(object obj)
Validate an object and its nested properties. Throws ConfigurationValidationException on failure.
TryValidateRecursive(object obj, List<ValidationResult> results)
Validate without throwing. Returns true if valid, populates results with errors if invalid.
AppTokenCredential(string? managedIdentityClientId = null)
Create credential for Azure authentication. Automatically selects cloud or local credential chain.ReplaceKeyVaultReferences(IConfiguration, SecretClient)
Replace all @KeyVault(SecretName) references with actual secret values.MIT License - see LICENSE file for details.
Contributions are welcome! Please open an issue or pull request on GitHub.