新电脑使用DefaultAzureCredential访问Azure Key Vault遇权限拒绝错误求助
问题描述
Web应用通过RBAC授权从公司共享Azure Key Vault获取密钥,正常运行无异常,但在新电脑上触发以下错误:
引发异常:“Azure.Identity.AuthenticationFailedException”位于System.Private.CoreLib.dll中
发生未处理的“Azure.Identity.AuthenticationFailedException”类型异常,位于System.Private.CoreLib.dll中
ManagedIdentityCredential 身份验证失败: 对路径'C:\ProgramData\AzureConnectedMachineAgent\Tokens\20f36e17-204a-4e08-b190-bda27a9402cb.key'的访问被拒绝。
凭据加载代码如下:
credentials = new DefaultAzureCredential(new DefaultAzureCredentialOptions() { VisualStudioTenantId = tenantId, SharedTokenCacheTenantId = tenantId, VisualStudioCodeTenantId = tenantId, InteractiveBrowserTenantId = tenantId, });
问题仅出现在新电脑,尝试过以管理员身份运行VS2022,但其他开发者用普通身份运行无此问题。
排查及解决方案
检查目录权限
新电脑上的C:\ProgramData\AzureConnectedMachineAgent\Tokens目录权限可能配置有误,确认当前用户对该目录及其中的.key文件拥有读取权限。操作路径:右键目录→属性→安全,添加当前用户并赋予读取权限。调整凭据优先级
DefaultAzureCredential会按预设顺序尝试多种凭据类型,新电脑可能误触发了托管身份验证优先级。可通过配置禁用ManagedIdentityCredential,强制使用VS/VSCode等本地开发凭据:credentials = new DefaultAzureCredential(new DefaultAzureCredentialOptions() { VisualStudioTenantId = tenantId, SharedTokenCacheTenantId = tenantId, VisualStudioCodeTenantId = tenantId, InteractiveBrowserTenantId = tenantId, ExcludeManagedIdentityCredential = true // 添加此行排除托管身份验证 });清理不必要的Agent
若本地开发不需要使用托管身份,可卸载新电脑上的Azure Connected Machine Agent,避免DefaultAzureCredential自动尝试该验证方式。重置Azure登录状态
新电脑上的VS/VSCode可能存在登录状态异常,尝试退出当前Azure账号后重新登录,确保使用的是拥有Key Vault访问权限的账号。
内容的提问来源于stack exchange,提问作者Ross Brasseaux

