使用Azure Functions访问Azure App Configuration时遇401未授权错误
我使用Azure App Configuration和Key Vault存储配置。最初用包含Endpoint、Id和Secret的访问密钥能正常工作,但这类敏感数据存在安全隐患。
之后尝试只使用Endpoint值,在Startup.cs中配置DefaultAzureCredential(),但启动Azure Function时一直报401(未授权)错误,提示访问令牌的发行者不正确,必须与配置存储所属订阅关联的AD租户匹配。我已经把个人账号添加到Azure App Configuration的IAM权限中,想知道错误原因和解决方法。
Startup中的ConfigureAppConfiguration代码
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder) { base.ConfigureAppConfiguration(builder); var configurationBuilder = builder.UseAppSettings().ConfigurationBuilder.AddEnvironmentVariables().Build(); var connectionString = configurationBuilder["appConfiguration"]; builder.ConfigurationBuilder.AddAzureAppConfiguration(options => { var credentials = new DefaultAzureCredential(); options.Connect(new Uri(connectionString), credentials) .Select(KeyFilter.Any, LabelFilter.Null) .Select(KeyFilter.Any, builder.GetContext().EnvironmentName) .ConfigureKeyVault(kv => { kv.SetCredential(new DefaultAzureCredential()); }); }); }
appsettings中的appConfiguration配置
"appConfiguration": "https://rta-dev-edu-app-config.azconfig.io"
错误信息
A host error has occurred during startup operation '9467e813-9979-44b9-8ecf-3d956fbaf72e'.
Azure.Data.AppConfiguration: Service request failed.
Status: 401 (Unauthorized)
WWW-Authenticate: HMAC-SHA256,Bearer error="invalid_token", error_description="The access token is from the wrong issuer. It must match the AD tenant associated with the subscription, to which the configuration store belongs. If you just transferred your subscription and see this error message, please try back later.
原因与解决方法
错误原因
DefaultAzureCredential会按顺序尝试多种身份源(本地开发时优先用Azure CLI、Visual Studio登录账号等),如果本地登录账号所属的AD租户和Azure App Configuration所在订阅的租户不一致,就会获取到错误租户的令牌,触发401。- 即使个人账号已加入目标租户的IAM权限,若本地环境默认使用其他租户的身份,依然会生成错误令牌。
解决方法
1. 切换本地登录账号到目标租户
如果用Azure CLI开发,执行命令切换租户:
az login --tenant <目标租户ID>
如果用Visual Studio,在「工具-选项-Azure服务」的登录选项中,切换到对应租户的账号。
2. 给DefaultAzureCredential显式指定目标租户ID
修改Startup.cs代码,创建DefaultAzureCredential时指定租户ID,避免获取错误令牌:
var credentials = new DefaultAzureCredential(new DefaultAzureCredentialOptions { TenantId = "<你的目标AD租户ID>" }); // Key Vault的Credential也要做同样配置 kv.SetCredential(new DefaultAzureCredential(new DefaultAzureCredentialOptions { TenantId = "<你的目标AD租户ID>" }));
租户ID可在Azure Portal的App Configuration资源概述页,或订阅属性页中查看。
3. 验证IAM权限配置
确认个人账号在Azure App Configuration的IAM中被赋予App Configuration Data Reader或更高权限(如App Configuration Data Owner),普通读者权限无法操作配置数据,必须使用专门的数据权限。
内容的提问来源于stack exchange,提问作者Ilya

