gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:53:43 24 4
gpt4 key购买 nike

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

DefaultAzureCredential failed to retrieve a token from the includedcredentials. See the troubleshooting guide for more information.https://aka.ms/azsdk/net/identity/defaultazurecredential/troubleshoot

  • ManagedIdentityCredential authentication unavailable. Multiple attempts failed to obtain a token from the managed identity endpoint.
  • Visual Studio Token provider can't be accessed at C:\WINDOWS\system32\config\systemprofile\AppData\Local.IdentityService\AzureServiceAuth\tokenprovider.json

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

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

"Could not find a part of the path 'C:\WINDOWS\system32\config\systemprofile\AppData\Local.IdentityService\AzureServiceAuth\tokenprovider.json'.

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

"Could not find a part of the path 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文件和提供者 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 ,但错误消息随后通知我文件架构不正确。我无法找到具有正确架构和值的示例。

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

_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 上的建议设置 setProfileEnvironmentloadUserProfiletrue如果这是 IIS 权限问题,但这没有什么区别 - 相同的错误仍然存​​在。

最后,我找到的唯一其他引用文献 tokenProvider.json文件位于 Microsoft's documentation for App Authentication ,但 Tools > Options > Azure Service Authentication 中不存在重新验证按钮按照建议的窗口。

"If you run into problems using Visual Studio, such as errors thatinvolve the token provider file, carefully review the preceding steps.

You may need to reauthenticate your developer token. To do so, selectTools > Options, and then select Azure Service Authentication. Lookfor a Re-authenticate link under the selected account. Select it toauthenticate."

因为我能够找到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)
);

最佳答案

发现this question on SO ,我发现tokenProvider.json存在于 C:\Users\<local user account> 下的同一目录中(通过 %LOCALAPPDATA%.IdentityService\AzureServiceAuth\ )并能够对其进行分析以供引用并将其复制到问题中提到的 IIS 目录。

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

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

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

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

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

  _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,
}));

关于c# - DefaultAzureCredetials 无法通过 Visual Studio 进行身份验证 - 找不到 AzureServiceAuth\tokenProvider.json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75086474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com