【问题标题】:Access Azure Key Vault with Managed Identity on Azure Batch running .NET Console Application在运行 .NET 控制台应用程序的 Azure Batch 上使用托管标识访问 Azure Key Vault
【发布时间】:2022-08-03 18:59:11
【问题描述】:

是否可以通过 Azure Batch 上的 Azure 托管标识设置访问 Azure Key Vault 机密?我已经阅读了 Microsoft 文档,我在技术上看到的唯一选择是使用基于证书的身份验证来访问 .net 控制台应用程序中的密钥库。由于托管标识可以在 Azure Batch 中使用,我认为可以利用 DefaultAzureCredential。我没有运气让它工作。

有没有人能够让它像这样工作,还是我将不得不接受使用基于证书的身份验证? 微软,如果你看到这个......有没有什么东西可以让这样的东西与托管身份一起使用

正在使用的技术:

  • Azure 托管标识:用户分配的 (id: xxxx)
  • Azure 密钥库
    • 将托管身份 (id: xxx) 添加到具有机密访问权限的访问策略:get、list
  • Azure 批处理
    • 批处理池
      • 已安装托管身份 (id: xxxx)
      • 应用程序:.Net 控制台应用程序(下面的代码所在的位置)
  • .Net 控制台应用程序
    • .Net6

这是我正在尝试做的事情:

DefaultAzureCredential credential = new DefaultAzureCredential( 
    new DefaultAzureCredentialOptions()
      {
         ManagedIdentityClientId = \"xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx\"
      });
            
Uri uri = new(\"https://xxxxxxx.vault.azure.net/\"); //Also Tried \"https://xxxxxxx.vault.azure.net/secrets/\"
            
SecretClient client = new(uri, credential);
var secret = await client.GetSecretAsync(secretName);
return secret?.Value.Value;

我从批处理作业的任务中收到的错误(过滤以显示 ManagedIdentityCredential 错误)

Unhandled exception. Azure.Identity.CredentialUnavailableException: ManagedIdentityCredential authentication unavailable. The requested identity has not been assigned to this resource.
Status: 400 (Bad Request)

Content:
{\"error\":\"invalid_request\",\"error_description\":\"Identity not found\"}

Headers:
Server: IMDS/150.870.65.684
Date: Wed, 27 Jul 2022 17:47:07 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 68

   at Azure.Identity.ImdsManagedIdentitySource.HandleResponseAsync(Boolean async, TokenRequestContext context, Response response, CancellationToken cancellationToken)
   at Azure.Identity.ManagedIdentitySource.AuthenticateAsync(Boolean async, TokenRequestContext context, CancellationToken cancellationToken)
   at Azure.Identity.ImdsManagedIdentitySource.AuthenticateAsync(Boolean async, TokenRequestContext context, CancellationToken cancellationToken)
   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, String additionalMessage)
   at Azure.Identity.ManagedIdentityCredential.GetTokenImplAsync(Boolean async, TokenRequestContext requestContext, CancellationToken cancellationToken)
   at Azure.Core.Pipeline.TaskExtensions.EnsureCompleted[T](ValueTask`1 task)
   at Azure.Identity.ManagedIdentityCredential.GetToken(TokenRequestContext requestContext, CancellationToken cancellationToken)
   at Azure.Security.KeyVault.ChallengeBasedAuthenticationPolicy.AuthenticateRequestAsync(HttpMessage message, Boolean async)
   at Azure.Security.KeyVault.ChallengeBasedAuthenticationPolicy.ProcessCoreAsync(HttpMessage message, ReadOnlyMemory`1 pipeline, Boolean async)
   at Azure.Security.KeyVault.ChallengeBasedAuthenticationPolicy.Process(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.HttpPipelinePolicy.ProcessNext(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.RedirectPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory`1 pipeline, Boolean async)
   at Azure.Core.Pipeline.TaskExtensions.EnsureCompleted(ValueTask task)
   at Azure.Core.Pipeline.RedirectPolicy.Process(HttpMessage message, ReadOnlyMemory`1 pipeline)
   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.TaskExtensions.EnsureCompleted(ValueTask task)
   at Azure.Core.Pipeline.RetryPolicy.Process(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.HttpPipelinePolicy.ProcessNext(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.HttpPipelineSynchronousPolicy.Process(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.HttpPipelinePolicy.ProcessNext(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.HttpPipelineSynchronousPolicy.Process(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.HttpPipelinePolicy.ProcessNext(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.HttpPipelineSynchronousPolicy.Process(HttpMessage message, ReadOnlyMemory`1 pipeline)
   at Azure.Core.Pipeline.HttpPipeline.Send(HttpMessage message, CancellationToken cancellationToken)
   at Azure.Core.Pipeline.HttpPipeline.SendRequest(Request request, CancellationToken cancellationToken)
   at Azure.Security.KeyVault.KeyVaultPipeline.SendRequest(Request request, CancellationToken cancellationToken)
   at Azure.Security.KeyVault.KeyVaultPipeline.SendRequest[TResult](RequestMethod method, Func`1 resultFactory, CancellationToken cancellationToken, String[] path)
   at Azure.Security.KeyVault.Secrets.SecretClient.GetSecret(String name, String version, CancellationToken cancellationToken)
   at wileyulab.infrastructure.SimpleService.Execute(String[] args) in C:\\AzDo\\WileyU\\wiley-u-lab\\wileyulab.infrastructure\\SimpleService.cs:line 55
   at wileyulab.consoleapp.simple.Program.Main(String[] args) in C:\\AzDo\\WileyU\\wiley-u-lab\\wileyulab.consoleapp.simple\\Program.cs:line 70

标签: .net azure-keyvault azure-batch azure-identity defaultazurecredential


【解决方案1】:

由于以下操作之一未正确配置,可能会发生以下错误。

未处理的异常。 Azure.Identity.CredentialUnavailableException: ManagedIdentityCredential 身份验证不可用。请求的 身份尚未分配给此资源。

  • 请确保在 Azure 服务中启用托管标识 使用前。

  • 由于您拥有用户分配的托管身份 DefaultAzureCredential ,您需要提供client Id并确保通过设置在代码中指定clientIdenvironment variables.

    AZURE_CLIENT_ID - service principal's app id
    AZURE_TENANT_ID - principal's Azure Active Directory tenantId
    AZURE_CLIENT_SECRET - service principal's client secrets
    
  • 确保正确授予托管标识role喜欢 contributor or reader 访问批处理和密钥库。

  • 在 Azure 门户中,创建 Key Vault 后,请添加 使用访问策略中的托管标识批量访问帐户 在 Key Permissions 下的 Setting 下。选择获取、列出、创建、包装密钥和解包密钥等需要哪些

笔记:

请稍等至少 15 分钟以传播角色,并且 然后尝试访问。

请确保您已在 azure 中登录到 Visual Studio 具有适当的角色/权限,因为托管身份只有在它 在 Azure 服务中运行。在本地运行时它将不起作用。

参考:

  1. Configure customer-managed keys for your Azure Batch account with Azure Key Vault and Managed Identity - Azure Batch | Microsoft Docs
  2. TROUBLESHOOTING· GitHub

【讨论】:

    猜你喜欢
    • 2020-06-02
    • 2022-09-28
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2018-05-22
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多