连接Azure Key Vault报Access denied to first party service如何解决
问题原因&解决步骤
1. 修正Key Vault名称传参错误
你当前使用的AddAzureKeyVault重载第一个参数要求传入Key Vault的名称字符串,而非完整访问URI,你appsettings.json里的VaultName配了完整URI,会导致认证路由错误。
修改appsettings.json配置:
"VaultName": "connectionstringkeyvault"
如果要使用完整URI,可以切换对应重载,写法如下:
config.AddAzureKeyVault(new Uri(vaultName), new DefaultAzureCredential(), new DefaultKeyVaultSecretManager());
2. 修正DefaultAzureCredential认证逻辑
本地调试时DefaultAzureCredential会按顺序读取环境变量、VS登陆账号、Azure CLI登陆账号、托管身份等凭证,你初始化时传了false参数禁用了交互式认证,如果当前环境没有默认凭证可用,就会拿不到合法token。
可以先调整初始化参数开启本地调试支持:
var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ExcludeInteractiveBrowserCredential = false });
本地运行前先确保你VS/VS Code登陆的Azure账号,或者执行az login登陆的账号,和你Key Vault访问策略里配置的授权账号一致。
3. 校验Key Vault访问策略配置
确认你访问策略中给当前使用的账号/服务主体授予了机密的Get、List权限,注意不要只给了其他权限(比如密钥、证书相关权限)。如果是部署到Azure服务,要给对应服务的托管身份授权对应机密权限。
4. 检查Key Vault网络配置
如果你的Key Vault开启了公共网络访问限制,需要将你本地调试的公网IP添加到Key Vault的防火墙允许列表中,否则也会触发访问拒绝异常。
5. 建议迁移到新SDK
你当前用的Microsoft.Azure.KeyVault属于已经停止维护的旧SDK,推荐替换为官方新的Azure.Security.KeyVault.Secrets和Azure.Extensions.AspNetCore.Configuration.Secrets包,写法更简洁,也避免旧版本的兼容问题:
.ConfigureAppConfiguration((context, config) => { var builtConfig = config.Build(); var vaultUri = new Uri(builtConfig["VaultUri"]); config.AddAzureKeyVault(vaultUri, new DefaultAzureCredential()); })
对应的appsettings.json配置:
"VaultUri": "https://connectionstringkeyvault.vault.azure.net/"
内容的提问来源于stack exchange,提问作者HarshSharma

