From 962ecb2f47ecd0e06429224843891f2d7cb1f67c Mon Sep 17 00:00:00 2001 From: Krzysztof Cwalina Date: Thu, 4 Sep 2025 09:23:29 -0700 Subject: [PATCH 1/2] added helper overload for Uri and TokenCredential --- .../AzureAppConfigurationExtensions.cs | 24 +++++++++++++++++++ .../Integration/IntegrationTests.cs | 20 ++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs index f8c2c5caf..89d297ae6 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. // +using Azure.Core; using Microsoft.Extensions.Configuration.AzureAppConfiguration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -63,6 +64,29 @@ public static IConfigurationBuilder AddAzureAppConfiguration( return configurationBuilder.AddAzureAppConfiguration(options => options.Connect(connectionStrings), optional); } + /// + /// Adds key-value data from an Azure App Configuration store to a configuration builder. + /// + /// The configuration builder to add key-values to. + /// The endpoint used to connect to the configuration store. + /// The used to authenticate requests to the configuration store. + /// Determines the behavior of the App Configuration provider when an exception occurs while loading data from server. If false, the exception is thrown. If true, the exception is suppressed and no settings are populated from Azure App Configuration. + /// will always be thrown when the caller gives an invalid input configuration (connection strings, endpoints, key/label filters...etc). + /// + /// The provided configuration builder. + public static IConfigurationBuilder AddAzureAppConfiguration( + this IConfigurationBuilder configurationBuilder, + Uri endpoint, + TokenCredential credential, + bool optional = false) + { + var source = new AzureAppConfigurationSource((options) => + { + options.Connect(endpoint, credential); + }, optional); + return configurationBuilder.Add(source); + } + /// /// Adds key-value data from an Azure App Configuration store to a configuration builder. /// diff --git a/tests/Tests.AzureAppConfiguration/Integration/IntegrationTests.cs b/tests/Tests.AzureAppConfiguration/Integration/IntegrationTests.cs index b932b3278..5fc7ee7a0 100644 --- a/tests/Tests.AzureAppConfiguration/Integration/IntegrationTests.cs +++ b/tests/Tests.AzureAppConfiguration/Integration/IntegrationTests.cs @@ -68,6 +68,7 @@ private class TestContext } private ConfigurationClient _configClient; + private Uri _configEndpoint; private SecretClient _secretClient; @@ -149,6 +150,8 @@ public async Task InitializeAsync() throw new InvalidOperationException($"App Configuration store '{AppConfigStoreName}' not found in resource group '{ResourceGroupName}'. Please create it before running tests.", ex); } + _configEndpoint = new Uri(appConfigStore.Data.Endpoint); + AsyncPageable accessKeys = appConfigStore.GetKeysAsync(); _connectionString = (await accessKeys.FirstAsync()).ConnectionString; @@ -448,6 +451,23 @@ public async Task LoadConfiguration_RetrievesValuesFromAppConfiguration() Assert.Equal("InitialValue2", config[$"{testContext.KeyPrefix}:Setting2"]); } + [Fact] + public async Task LoadConfiguration_TokenCredentialHelperOverloadWorks() + { + // Arrange - Setup test-specific keys + TestContext testContext = CreateTestContext("BasicConfig"); + await SetupKeyValues(testContext); + + // Act + var config = new ConfigurationBuilder() + .AddAzureAppConfiguration(_configEndpoint, _defaultAzureCredential) + .Build(); + + // Assert + Assert.Equal("InitialValue1", config[$"{testContext.KeyPrefix}:Setting1"]); + Assert.Equal("InitialValue2", config[$"{testContext.KeyPrefix}:Setting2"]); + } + [Fact] public async Task RefreshAsync_UpdatesConfiguration_WhenSentinelKeyChanged() { From ecaf8b04ab3341d88445150b96fca9a7fe3da9f4 Mon Sep 17 00:00:00 2001 From: Krzysztof Cwalina Date: Thu, 4 Sep 2025 13:39:18 -0700 Subject: [PATCH 2/2] formatting --- .../AzureAppConfigurationExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs index 89d297ae6..8cc2e51a3 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs @@ -84,6 +84,7 @@ public static IConfigurationBuilder AddAzureAppConfiguration( { options.Connect(endpoint, credential); }, optional); + return configurationBuilder.Add(source); }