为了账号安全,请及时绑定邮箱和手机立即绑定

VisualStudioCodeCredential.get_token 失败

VisualStudioCodeCredential.get_token 失败

慕桂英4014372 2023-07-27 16:33:29
我在 VS Code 中使用 Jupyter Notebook 和 Azure Python SDK 进行本地开发。安装了相关的 VS Code 扩展:PythonAzure 帐户Azure 存储(也许相关?)目标:DefaultCredential使用身份验证从 Azure Keyvault 检索机密由于没有环境变量或ManagedIdentity凭据,DefaultCredential因此应默认从 VS Code 中提取我的凭据问题:import loggingfrom azure.keyvault.secrets import SecretClientfrom azure.identity import DefaultAzureCredentialkeyvault_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**.到目前为止尝试过:F1, Azure: Sign in通过浏览器进行身份验证不用找了看起来DefaultCredential()信用链正在运行,但它无法运行...get Azure user details from Visual Studio Code.。这是因为我正在 VS Code 中的 Jupyter Notebook 内进行开发,还是存在其他问题?看起来Python .NET SDK 也发生了类似的情况。
查看完整描述

4 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

不知道为什么它不起作用,它看起来是正确的。如果您只想使用 Visual Studio Code 登录,也可以使用AzureCliCredential. 它在我这边起作用。


您可以用来az login登录您的帐户。然后您将使用该代码获得秘密。


from azure.keyvault.secrets import SecretClient

from azure.identity import DefaultAzureCredential,AzureCliCredential


keyvault_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)

//img1.sycdn.imooc.com/64c22c080001f60c06090038.jpg

//img1.sycdn.imooc.com/64c22c12000156e905890052.jpg

查看完整回答
反对 回复 2023-07-27
?
富国沪深

TA贡献1790条经验 获得超9个赞

还有另一种简单的方法可以解决此问题。我们可以使用前面的配置选项。

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。

//img2.sycdn.imooc.com/64c22c2e0001b1d906530126.jpg

查看完整回答
反对 回复 2023-07-27
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

如文档中所述:

VisualStudioCodeCredential 不适用于高于 0.9.11 的 Azure 帐户扩展版本,这是一个已知问题。此问题的长期解决方案正在进行中。同时,请考虑通过 Azure CLI 进行身份验证。

举:DefaultAzureCredential(exclude_visual_studio_code_credential=True)

无论如何,根据vscode扩展的版本,我们可能需要使用另一种身份验证方式,例如SharedTokenCacheCredentialAzureCliCredential甚至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 变量的优点是它可以被其他身份验证方法使用,即InteractiveBrowserCredentialVisualStudioCodeCredential


查看完整回答
反对 回复 2023-07-27
?
月关宝盒

TA贡献1772条经验 获得超5个赞

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 不可用。


查看完整回答
反对 回复 2023-07-27
  • 4 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信