DefaultAzureCredetials 无法通过 Visual Studio 进行身份验证 - 找不到 AzureServiceAuth\tokenProvider.json

2023-12-14

我正在尝试从以下位置连接到 Azure Key Vault 实例:.NET 4.7在 IIS 和调试器下本地运行的应用程序 (Visual Studio 202217.4.4)但遇到以下异常Azure.Identity当调用执行 KeyVault 操作(例如)时尝试检索令牌以向 Azure 进行身份验证时包GetSecretAsync().

DefaultAzureCredential 无法从包含的内容中检索令牌 证书。有关详细信息,请参阅故障排除指南。https://aka.ms/azsdk/net/identity/defaultazurecredential/troubleshoot

  • ManagedIdentityCredential 身份验证不可用。多次尝试未能从托管身份端点获取令牌。
  • 无法在 C:\WINDOWS\system32\config\systemprofile\AppData\Local.IdentityService\AzureServiceAuth\tokenprovider.json 访问 Visual Studio 令牌提供程序

我需要在生产等云环境中通过用户分配的托管标识连接到 KeyVault 实例,而在开发环境中,我们因此需要通过开发人员的 Visual Studio 帐户进行连接,以对他们进行身份验证以访问服务,类似地。也许我误解了,但我相信这是可能的DefaultAzureCredential选项,它将按顺序尝试各种身份验证方法(例如环境变量、托管标识、Visual Studio 凭据等),直到成功。

在检查与 Visual Studio 凭据流相关的内部异常时,我看到System.Exception {System.IO.DirectoryNotFoundException}异常消息指出...

“找不到路径“C:\WINDOWS\system32\config\systemprofile\AppData\Local.IdentityService\AzureServiceAuth\tokenprovider.json”的一部分。

此前,该消息曾表述过以下消息(据我所知,这是该文件的最新位置),直到我尝试在 Visual Studio 2019 下运行进行比较,此时,它更改为上述消息。

“找不到路径 C:\Users[AppPoolName]\AppData\Local.IdentityService\AzureServiceAuth\tokenProvider.json 的一部分”。

起初,我注意到该路径不存在.IdentityService继续,因此遵循了对此的建议MSFT 论坛帖子恢复AppAuthentification从 VS2019 扩展到 VS2022 的配置以恢复C:\Users\<AppPoolName>\AppData\Local\.IdentityService\AzureServiceAuth\tokenprovider.json文件和提供者TokenProviders作为通往C:\Program Files (x86)\Microsoft Visual Studio\<version>\Enterprise\Common7\IDE\Extensions\<random dir name>\TokenService\Microsoft.Asal.TokenService.exe。在下一个版本中,我注意到.IdentityService已创建,但未创建正在进行的目录或文件。

然后,我多次尝试注销并进入 Visual Studio,但这似乎并没有创建剩余的丢失目录和文件。手动创建目录和文件当然可以解决System.IO.DirectoryNotFoundException,但错误消息随后通知我文件架构不正确。我无法找到具有正确架构和值的示例。

在客户端配置选项方面,我已明确将身份验证流程模式限制为ManagedIdentity and VisualStudioCredential为了简单起见,在注意到其他方法(例如AzureCLI尽管已登录,但 Azure PowerShell 模块也失败了)。

_client = new SecretClient(new Uri(options.KeyVaultUri), new DefaultAzureCredential(
    new DefaultAzureCredentialOptions
    {
        ExcludeManagedIdentityCredential = false,
        ExcludeVisualStudioCredential = false,
        ExcludeInteractiveBrowserCredential = true,
        ExcludeAzurePowerShellCredential = true,
        ExcludeAzureCliCredential = true,
        ExcludeEnvironmentCredential = true,
        ExcludeVisualStudioCodeCredential = true,
        ExcludeSharedTokenCacheCredential = true,
        ManagedIdentityClientId = options.ManagementIdentityClientId
    }
));

我也尝试过有关的建议Azure SDK GitHub 问题 #4590设置的数量setProfileEnvironment and loadUserProfile to true如果这是 IIS 权限问题,但这没有什么区别 - 相同的错误仍然存​​在。

最后,我找到的唯一其他参考tokenProvider.json文件位于Microsoft 的应用程序身份验证文档,但重新验证按钮不存在Tools > Options > Azure Service Authentication按照建议的窗口。

“如果您在使用 Visual Studio 时遇到问题,例如以下错误 涉及令牌提供程序文件,请仔细检查前面的步骤。

您可能需要重新验证您的开发者令牌。为此,请选择 工具 > 选项,然后选择 Azure 服务身份验证。看 获取所选帐户下的重新验证链接。选择它以 认证。”

因为我能够找到C:\Program Files (x86)\Microsoft Visual Studio\<version>\Enterprise\Common7\IDE\Extensions\<random dir name>\TokenService\Microsoft.Asal.TokenService.exe及其相关的配置文件,我怀疑它丢失了tokenProvider.json文件就是问题所在,但我不知道是什么负责创建该文件,也不知道它应该包含什么。

任何见解或指示将不胜感激。

著名的软件包及其使用的版本:

  • Azure.Identity @ v1.8.0
  • Azure.Security.KeyVault.Secrets @ v4.4.0

Edit (1)

正如人们所期望的那样,我可以通过在 Key Vault 上授予用于 Azure AD 应用程序注册的 RBAC 记录来配置替代流程,然后使用ClientSecretCredential流动代替DefaultAzureCredentials流(如下)。但这并不能以最好的方式解决问题,所以如果有人能发现我的错误所在,我会很感兴趣DefaultAzureCredentials流动,如果有的话。

_client = new SecretClient(new Uri(options.KeyVaultUri), 
    new ClientSecretCredential(options.TenantId, options.ClientId, options.Secret)
);

发现后这个问题关于SO, 我找到tokenProvider.json存在于同一目录下C:\Users\<local user account> (via %LOCALAPPDATA%.IdentityService\AzureServiceAuth\)并能够对其进行分析以供参考并将其复制到问题中提到的 IIS 目录。

正如建议的Johnny5, 它似乎VisualStudioCredentials以登录域用户身份执行,但 IIS 以ApplicationPoolIdentity,因此它不会访问域用户位置下的文件,也不会创建文件,因为它未登录到 Visual Studio。经过对如何更改此设置的一些研究后,我能够将 IIS 应用程序池身份设置为与登录的 Visual Studio 帐户匹配的域用户。

为此,请按照下列步骤操作

  • Open IIS Manager> 前往Application Pools
  • 右键单击相关池,然后单击Advanced Settings...
  • 单击旁边的三点按钮Identity设置(可能ApplicationPoolIdentity)
  • Select Custom Account并输入您的凭据(包括任何域前缀 - 例如DOMAIN\MyUser)

如果您不确定您的域,请打开命令提示符并输入echo %USERDOMAIN%找到它。

然后我设置了SecretClient身份验证流回使用DefaultAzureCredential像这样,在本地重新测试,并成功 - 检索到秘密。

  _client = new SecretClient(new Uri(options.KeyVaultUri), new DefaultAzureCredential(
      new DefaultAzureCredentialOptions()
      {
          ExcludeEnvironmentCredential = true,
          ExcludeVisualStudioCodeCredential = true,
          ExcludeAzureCliCredential = true,
          ExcludeAzurePowerShellCredential = true,
          ExcludeSharedTokenCacheCredential = true,
          ExcludeInteractiveBrowserCredential = true,
          ExcludeManagedIdentityCredential = false,
          ExcludeVisualStudioCredential = false,
          ManagedIdentityClientId = options.ManagementIdentityClientId,
      }));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DefaultAzureCredetials 无法通过 Visual Studio 进行身份验证 - 找不到 AzureServiceAuth\tokenProvider.json 的相关文章

随机推荐