VisualStudioCodeCredential.get_token 失败

我在 VS Code 中使用 Jupyter Notebook 和 Azure Python SDK 进行本地开发。

安装了相关的 VS Code 扩展

  • Python

  • Azure 帐户

  • Azure 存储(也许相关?)

目标:

  • DefaultCredential使用身份验证从 Azure Keyvault 检索机密

  • 由于没有环境变量或ManagedIdentity凭据,DefaultCredential因此应默认从 VS Code 中提取我的凭据

问题:

import logging

from azure.keyvault.secrets import SecretClient

from azure.identity import DefaultAzureCredential


keyvault_name = "kv-test"

keyvualt_url = "https://" + keyvault_name + ".vault.azure.net"

keyvault_credential = DefaultAzureCredential()

kv_secret1_name = "secret-test"


keyvault_client = SecretClient(vault_url=keyvualt_url, credential=keyvault_credential)


retrieved_key = keyvault_client.get_secret(kv_secret1_name)

        

logging.info("Account key retrieved from Keyvault")


错误:


EnvironmentCredential.get_token failed: EnvironmentCredential authentication unavailable. Environment variables are not fully configured.


ManagedIdentityCredential.get_token failed: ManagedIdentityCredential authentication unavailable, no managed identity endpoint found.


SharedTokenCacheCredential.get_token failed: SharedTokenCacheCredential authentication unavailable. No accounts were found in the cache.


VisualStudioCodeCredential.get_token failed: **Failed to get Azure user details from Visual Studio Code**.

到目前为止尝试过:

  • F1Azure: Sign in

    • 通过浏览器进行身份验证

    • 不用找了

看起来DefaultCredential()信用链正在运行,但它无法运行...get Azure user details from Visual Studio Code.

这是因为我正在 VS Code 中的 Jupyter Notebook 内进行开发,还是存在其他问题?看起来Python .NET SDK 也发生了类似的情况。


慕桂英4014372
浏览 195回答 4
4回答

梦里花落0921

不知道为什么它不起作用,它看起来是正确的。如果您只想使用 Visual Studio Code 登录,也可以使用AzureCliCredential. 它在我这边起作用。您可以用来az login登录您的帐户。然后您将使用该代码获得秘密。from azure.keyvault.secrets import SecretClientfrom azure.identity import DefaultAzureCredential,AzureCliCredentialkeyvault_credential= AzureCliCredential()secret_client = SecretClient("https://{vault-name}.vault.azure.net", keyvault_credential)secret = secret_client.get_secret("secret-name")print(secret.name)print(secret.value)

富国沪深

还有另一种简单的方法可以解决此问题。我们可以使用前面的配置选项。if self.local_dev:   print(f"Local Dev is {self.local_dev}")   self.az_cred = DefaultAzureCredential(       exclude_environment_credential=True,       exclude_managed_identity_credential=True,       exclude_shared_token_cache_credential=True,       exclude_interactive_browser_credential=True,       exclude_powershell_credential=True,       exclude_visual_studio_code_credential=False,       exclude_cli_credential=False,       logging_enable=True,       )else:    self.az_cred = DefaultAzureCredential(      exclude_environment_credential=True, logging_enable=True      )请注意,exclude_visual_studio_code_credential和 exclude_cli_credentialas 设置为False以及其他设置True为排除本地开发,并exclude_environment_credential设置True为用于其他环境(例如生产)。default.py您可以在 package.json文件中看到这些配置azure identity。

Cats萌萌

如文档中所述:VisualStudioCodeCredential 不适用于高于 0.9.11 的 Azure 帐户扩展版本,这是一个已知问题。此问题的长期解决方案正在进行中。同时,请考虑通过 Azure CLI 进行身份验证。举:DefaultAzureCredential(exclude_visual_studio_code_credential=True)无论如何,根据vscode扩展的版本,我们可能需要使用另一种身份验证方式,例如SharedTokenCacheCredential,AzureCliCredential甚至InteractiveBrowserCredential。就我而言,我的身份验证在该步骤中失败SharedTokenCacheCredential,据我所知,这是 Microsoft 产品之间使用的共享缓存。因此,我认为其他安装了 Microsoft 产品的人也可能会发生同样的情况。它失败了,因为我的目标租户未包含在此缓存中。为了解决这个问题,我有两个选择:要么禁用共享令牌凭据,要么将目标租户包含在共享缓存中。对于第一个选项,我们可以执行与禁用 vscode 类似的操作:DefaultAzureCredential(exclude_shared_token_cache_credential=True)对于第二个选项,我按照DefaultAzureCredential(additionally_allowed_tenants=[TENANT_ID])中的建议进行了操作: 。但通过查看源代码,我们似乎可以通过以下方式实现相同的目的:将目标租户 ID 设置为名为 的环境变量AZURE_TENANT_ID,或者;直接传递共享缓存租户id:DefaultAzureCredential(shared_cache_tenant_id="TENANT_ID")请注意,env 变量的优点是它可以被其他身份验证方法使用,即InteractiveBrowserCredential和VisualStudioCodeCredential。

月关宝盒

SharedTokenCacheCredential 上的身份验证失败。排除它修复了排除_shared_token_cache_credential 设置为 true 的问题。从 SDK 代码中可以看出,当我们配置了某些凭据方法并且该方法失败时,链中的其他方法将被跳过。for credential in self.credentials:        try:            token = await credential.get_token(*scopes, **kwargs)            _LOGGER.info("%s acquired a token from %s", self.__class__.__name__, credential.__class__.__name__)            self._successful_credential = credential            return token        except CredentialUnavailableError as ex:            # credential didn't attempt authentication because it lacks required data or state -> continue            history.append((credential, ex.message))        except Exception as ex:  # pylint: disable=broad-except            # credential failed to authenticate, or something unexpectedly raised -> break            history.append((credential, str(ex)))            _LOGGER.debug(                '%s.get_token failed: %s raised unexpected error "%s"',                self.__class__.__name__,                credential.__class__.__name__,                ex,                exc_info=True,            )            break #<------------------注意循环中的最后一个中断。因此,另一种方法是让 SharedTokenCacheCredential 不可用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python