【问题标题】:DefaultAzureCredetials can't authenticate via Visual Studio - Can't find AzureServiceAuth\tokenProvider.jsonDefaultAzureCredetials 无法通过 Visual Studio 进行身份验证 - 找不到 AzureServiceAuth\\tokenProvider.json
【发布时间】:2023-01-12 20:32:12
【问题描述】:

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

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 forum post 的建议将 AppAuthentification 扩展名从 VS2019 恢复到 VS2022 的配置中以恢复 C:\Users\<AppPoolName>\AppData\Local\.IdentityService\AzureServiceAuth\tokenprovider.json 文件并提供 @ 987654337@ 作为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,但错误消息随后通知我文件架构不正确。我找不到具有正确架构和值的示例。

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

_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 Issue #4590 上的建议,将 setProfileEnvironmentloadUserProfile 设置为 true 以防这是 ​​IIS 权限问题,但这没有任何区别 - 同样的错误继续存在。

最后,我发现tokenProvider.json 文件的唯一其他参考位于Microsoft's documentation for App Authentication,但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 文件上,但我不知道是什么负责创建它,也不知道它应该包含什么。

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

值得注意的软件包及其使用的版本:

编辑 (1)

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

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

【问题讨论】:

    标签: c# .net azure visual-studio azure-keyvault


    【解决方案1】:

    找到this question on SO后,我发现tokenProvider.json存在于C:Users<local user account>下的同一个目录下,可以分析参考并复制到IIS中。正如Johnny5所建议的那样,VisualStudioCredentials似乎作为登录域用户执行,但IIS作为ApplicationPoolIdentity运行,因此它不访问域用户位置下的文件并且不创建一个因为它没有登录到 Visual Studio。在对如何改变这一点进行一些研究后,我能够将 IIS 应用程序池身份设置为我的域用户,该用户与登录的 Visual Studio 帐户相匹配。

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

    • 打开IIS Manager>转到Application Pools
    • 右键单击相关池,然后单击Advanced Settings...
    • 单击Identity 设置旁边的三点按钮(可能是ApplicationPoolIdentity
    • 选择Custom Account并输入您的凭据(包括任何域前缀 - 例如DOMAINMyUser

    如果您不确定自己的域,请打开命令提示符并输入 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,
          }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2017-08-31
      • 1970-01-01
      • 2018-12-28
      相关资源
      最近更新 更多