本地IIS环境下使用DefaultAzureCredential访问Azure Key Vault遇认证问题
我在使用Azure Key Vault存储和检索密钥时遇到问题,本地IIS网站中运行的C#代码在获取密钥时崩溃。代码如下:
var keyVaultURL = configuration["AzureKeyVaultUrl"]; var secretsClient = new SecretClient(new Uri(keyVaultURL), new DefaultAzureCredential()); var snipcartAPIKey = secretsClient.GetSecret("MyKeyNameHere").Value;
执行到GetSecret()方法时抛出以下错误:
AggregateException: Multiple exceptions were encountered while attempting to authenticate. (EnvironmentCredential authentication unavailable. Environment variables are not fully configured.) (ManagedIdentityCredential authentication unavailable. No Managed Identity endpoint found.) (SharedTokenCacheCredential authentication unavailable. No accounts were found in the cache.) (Visual Studio Token provider file not found at C:\Users\AsoRockFood.local\AppData\Local.IdentityService\AzureServiceAuth\tokenprovider.json) (Stored credentials not found. Need to authenticate user in VSCode Azure Account.) (Please run 'az login' to set up account)
我清楚DefaultAzureCredential会依次尝试多种认证方式,本来指望Visual Studio 2022的登录账号能生效,但错误提示指定路径下找不到tokenprovider.json文件。我发现其他用户目录下有这个文件,删除后会自动重新生成,但错误里的路径并不是那个位置。
已经完成以下检查:
- 已在Visual Studio和Azure CLI中登录正确的Azure账号;
- 确认Tools > Options > Azure Service Authentication配置了对应Azure账号;
- 创建Azure Vault实例的账号与Visual Studio、Azure CLI使用的账号一致,且拥有正确权限;
- 已按要求将applicationHost.config中的
setProfileEnvironment设置为True; - 已安装Visual Studio 2022最新更新及Azure开发组件。
解决方法
1. 调整IIS应用池的运行身份
错误里的用户目录AsoRockFood.local是IIS应用池当前使用的身份目录,默认的应用池身份(比如ApplicationPoolIdentity或本地系统账户)和你登录Visual Studio的用户不是同一个,自然找不到对应令牌文件。
修改步骤:
- 打开IIS管理器,找到你的网站对应的应用池;
- 右键选择「高级设置」;
- 在「进程模型」下的「标识」选项,点击右侧的「...」按钮;
- 选择「自定义账户」,点击「设置」,输入你登录Visual Studio的本地用户名和密码;
- 重启应用池和网站。
2. 手动触发Visual Studio生成令牌文件
如果改了应用池身份后仍未生成文件,可以手动触发:
- 完全关闭Visual Studio;
- 删除你之前找到的其他用户目录下的
tokenprovider.json; - 重新打开Visual Studio,确认已登录Azure账号;
- 打开项目并尝试运行,Visual Studio会在当前应用池运行身份的用户目录下重新生成令牌文件。
3. 改用Azure CLI认证兜底
如果Visual Studio认证还是有问题,可以让DefaultAzureCredential优先用Azure CLI的凭据:
- 确保已经运行
az login登录正确的Azure账号; - 代码里可以调整认证顺序,让AzureCliCredential优先(或者不用改,只要Azure CLI已登录,
DefaultAzureCredential会自动尝试):
var options = new DefaultAzureCredentialOptions { CredentialPolicies = { new AzureCliCredential() } }; var secretsClient = new SecretClient(new Uri(keyVaultURL), new DefaultAzureCredential(options));
只要应用池用你的本地用户身份运行,就能访问Azure CLI的缓存凭据。
4. 确认环境变量传递生效
确保IIS已正确传递用户环境变量:
- 再次确认
applicationHost.config中的setProfileEnvironment已设为True; - 运行
iisreset命令重启IIS服务,确保配置生效。
内容的提问来源于stack exchange,提问作者Ayo Adesina

