Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
changes:
- section: "Bugs Fixed"
description: "Configure AppConfigurationAudience when creating AppConfiguration SDK clients"
Comment thread
alzimmermsft marked this conversation as resolved.
30 changes: 20 additions & 10 deletions tools/Azure.Mcp.Tools.AppConfig/src/Services/AppConfigService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Azure.Mcp.Core.Models.Identity;
using Azure.Mcp.Core.Options;
using Azure.Mcp.Core.Services.Azure;
using Azure.Mcp.Core.Services.Azure.Authentication;
using Azure.Mcp.Core.Services.Azure.Subscription;
using Azure.Mcp.Core.Services.Azure.Tenant;
using Azure.Mcp.Tools.AppConfig.Models;
Expand Down Expand Up @@ -168,7 +169,7 @@ public async Task DeleteKeyValue(

private async Task<ConfigurationClient> GetConfigurationClient(string accountName, string subscription, string? tenant, RetryPolicyOptions? retryPolicy, CancellationToken cancellationToken)
{
var configStore = await FindAppConfigStore(subscription, accountName, subscription, retryPolicy, cancellationToken);
var configStore = await FindAppConfigStore(subscription, tenant, accountName, subscription, retryPolicy, cancellationToken);
var endpoint = configStore.Endpoint;
if (string.IsNullOrEmpty(endpoint))
{
Expand All @@ -177,8 +178,9 @@ private async Task<ConfigurationClient> GetConfigurationClient(string accountNam

EndpointValidator.ValidateAzureServiceEndpoint(endpoint, "appconfig");

var credential = await GetCredential(cancellationToken);
var credential = await GetCredential(tenant, cancellationToken);
var options = new ConfigurationClientOptions();
options.Audience = GetAppConfigurationAudience();
AddDefaultPolicies(options);

var endpointUri = new Uri(endpoint);
Expand All @@ -191,25 +193,22 @@ private async Task<ConfigurationClient> GetConfigurationClient(string accountNam

private async Task<AppConfigurationAccount> FindAppConfigStore(
string subscription,
string? tenant,
string accountName,
string subscriptionIdentifier,
RetryPolicyOptions? retryPolicy,
CancellationToken cancellationToken)
{
var account = await ExecuteSingleResourceQueryAsync(
return await ExecuteSingleResourceQueryAsync(
"Microsoft.AppConfiguration/configurationStores",
resourceGroup: null, // all resource groups
subscription: subscription,
retryPolicy: retryPolicy,
converter: ConvertToAppConfigurationAccountModel,
additionalFilter: $"name =~ '{EscapeKqlString(accountName)}'",
cancellationToken: cancellationToken);

if (account == null)
{
throw new KeyNotFoundException($"App Configuration store '{accountName}' not found for subscription '{subscriptionIdentifier}'.");
}
return account;
tenant: tenant,
cancellationToken: cancellationToken)
?? throw new KeyNotFoundException($"App Configuration store '{accountName}' not found for subscription '{subscriptionIdentifier}'.");
}

/// <summary>
Expand Down Expand Up @@ -266,4 +265,15 @@ private static AppConfigurationAccount ConvertToAppConfigurationAccountModel(Jso
}
};
}

private AppConfigurationAudience GetAppConfigurationAudience()
{
return TenantService.CloudConfiguration.CloudType switch
{
AzureCloudConfiguration.AzureCloud.AzurePublicCloud => AppConfigurationAudience.AzurePublicCloud,
AzureCloudConfiguration.AzureCloud.AzureChinaCloud => AppConfigurationAudience.AzureChina,
AzureCloudConfiguration.AzureCloud.AzureUSGovernmentCloud => AppConfigurationAudience.AzureGovernment,
_ => AppConfigurationAudience.AzurePublicCloud
};
}
}