可以在本地使用“用户分配的托管身份”吗?

Gau*_*tri 6 azure azure-active-directory azure-managed-identity

User Assigned Managed Identity我正在尝试在我们的一个应用程序中使用 a 。我还了解了 之间的差异System Assigned Managed Identity and User Assigned Managed Identity

我很清楚,aSystem Assigned Managed Identity不能在本地使用,因为您要为 Azure 资源分配身份。

不过我不清楚 a 是否User Assigned Managed Identity可以在本地使用。我唯一能找到的是以下内容:

在此输入图像描述

在我的场景中,我想从 Azure Key Vault 读取一些机密。我创建了一个用户分配的托管身份,并在 Key Vault 上配置了访问策略,以向该身份授予必要的权限。考虑到我使用此身份来访问 Azure Key Vault(这是一种 Azure 资源),我的期望是,无论我的代码在何处运行(使用 JetBrains Rider 作为我的 IDE),它都应该可以工作。

但是,当我尝试做类似的事情时:

var managedIdentityCredential = new ManagedIdentityCredential("managed-identity-id");
SecretClient secretClient = new(new Uri("https://mykeyvault.vault.azure.net/"), managedIdentityCredential);
KeyVaultSecret secret = await secretClient.GetSecretAsync(key);
Run Code Online (Sandbox Code Playgroud)

当我在本地运行代码时,收到错误Azure.Identity.CredentialUnavailableException消息:ManagedIdentityCredential authentication unavailable. No Managed Identity endpoint found

Azure.Identity.CredentialUnavailableException: ManagedIdentityCredential authentication unavailable. No Managed Identity endpoint found.
   at Azure.Identity.ManagedIdentityClient.AuthenticateAsync(Boolean async, TokenRequestContext context, CancellationToken cancellationToken)
   at Azure.Identity.ManagedIdentityCredential.GetTokenImplAsync(Boolean async, TokenRequestContext requestContext, CancellationToken cancellationToken)
   at Azure.Identity.CredentialDiagnosticScope.FailWrapAndThrow(Exception ex)
   at Azure.Identity.ManagedIdentityCredential.GetTokenImplAsync(Boolean async, TokenRequestContext requestContext, CancellationToken cancellationToken)
   at Azure.Identity.ManagedIdentityCredential.GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken)
   at Azure.Security.KeyVault.ChallengeBasedAuthenticationPolicy.AuthenticateRequestAsync(HttpMessage message, Boolean async, AuthenticationChallenge challenge)
   at Azure.Security.KeyVault.ChallengeBasedAuthenticationPolicy.ProcessCoreAsync(HttpMessage message, ReadOnlyMemory`1 pipeline, Boolean async)
   at Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory`1 pipeline, Boolean async)
   at Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory`1 pipeline, Boolean async)
   at Azure.Core.Pipeline.HttpPipeline.SendRequestAsync(Request request, CancellationToken cancellationToken)
   at Azure.Security.KeyVault.KeyVaultPipeline.SendRequestAsync(Request request, CancellationToken cancellationToken)
   at Azure.Security.KeyVault.KeyVaultPipeline.SendRequestAsync[TResult](RequestMethod method, Func`1 resultFactory, CancellationToken cancellationToken, String[] path)
   at Azure.Security.KeyVault.Certificates.CertificateClient.GetCertificateAsync(String certificateName, CancellationToken cancellationToken)
Run Code Online (Sandbox Code Playgroud)

对此的任何见解都将受到高度赞赏。

All*_* Wu 7

ManagedIdentityCredential不可以。本地环境也不支持用户管理的身份。

您应该使用DefaultAzureCredential以使代码在本地环境中运行。

请参阅此处的注释提示。

笔记

仅适用ManagedIdentityCredential于支持托管身份验证的服务的 Azure 环境。它在本地环境中不起作用。使用DefaultAzureCredential使代码可以在本地和 Azure 环境中工作,因为它将回退到一些身份验证选项,包括托管标识。

如果您希望在部署到 Azure 时使用用户 分配的托管标识DefaultAzureCredential请指定 clientId