【问题标题】:From localhost C# Web API - Accessing secret from Azure KeyVault throws error Invalid Issuer从本地主机 C# Web API - 从 Azure KeyVault 访问机密会引发错误 Invalid Issuer
【发布时间】:2021-10-09 05:40:03
【问题描述】:

我正在尝试从本地 Web api 使用 Azure.Identity 库从 KeyVault 检索机密。 但它会抛出 Invalid Issuer。下面给出我正在使用的代码

我当前的代码

var client = new SecretClient(new Uri("key-vault-url"), new DefaultAzureCredential());    ==> line #1
var secret = client.GetSecret("DicomSecret").Value;                           ==> line #2

一旦解析第 2 行,就会引发以下错误。

我的尝试

  1. 我已通过“添加访问策略”在 KeyVault 中添加了我的 Azure 凭据
  2. 尝试在第 1 行中使用 ManagedIdentityCredential 而不是 DefaultAzureCredential
  3. 还尝试在第 1 行中使用 VisualStudioCredential 而不是 DefaultAzureCredential

我还读到我可以使用 EnvironmentCredential,我需要为此提供 AZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET,但我不确定如何以及为此包括什么 - 我无权访问 AAD。

请告诉我如何解决此问题。

【问题讨论】:

  • 你有什么进展吗?请随时在这里分享您的问题,如果您觉得我的帖子对您​​有帮助,您可以接受它作为答案吗?
  • 是的@TinyWang 感谢您的回复。我已经解决了。在我的开发环境(本地主机)中,我必须使用 DefaultAzureCredentialOptions VisualStudioTenantId 和 SecretClient。我将在下面添加我的答案。

标签: c# azure asp.net-core-webapi azure-keyvault azure-identity


【解决方案1】:

由于我尝试从本地开发环境(VS 2019)连接到 Azure,因此需要额外的凭据。

所以从我的开发环境(本地主机)我不得不使用 DefaultAzureCredentialOptions VisualStudioTenantId 以及 SecretClient。

var tenantId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
DefaultAzureCredentialOptions options = new DefaultAzureCredentialOptions()
 { 
     VisualStudioTenantId = tenantId, 
     SharedTokenCacheTenantId = tenantId 
};
var client = new SecretClient(
             new Uri(key-vault-url), 
             new DefaultAzureCredential(options)
             );
  

以上内容帮助我从本地执行,但在将其部署到 Azure Ap Service 后,下面的代码行就足够了。所以我只将上面的代码用于我的本地测试。

var client = new SecretClient(new Uri("key-vault-url"), new DefaultAzureCredential()); 

                

【讨论】:

    【解决方案2】:

    这是我的代码,看起来和你的没什么区别。

    using Azure.Identity;
    using Azure.Security.KeyVault.Secrets;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Identity.Client;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace test0430callingapi.Controllers
    {
        public class HelloController : Controller
        {
            public async Task<string> IndexAsync()
            {
                const string secretName = "clientsecret";
                var kvUri = "https://keyvaultname.vault.azure.net/";
                var a = new DefaultAzureCredential();
                var client = new SecretClient(new Uri(kvUri), a);
                var secret = await client.GetSecretAsync(secretName);
                string secretVaule = secret.Value.Value;
                return secretVaule ;
            }
        }
    }
    

    那我想你可以试试看DefaultAzureCredential。在visual studio 中运行代码时,我们需要通过在门户中添加访问策略来确保您已使用具有 azure key vault 访问权限的用户登录。或者您可能已经添加了用户,然后您可以检查是否为用户添加了足够的权限。

    如果它也失败了,你可以尝试另一种方式通过 api 访问 key vault。更多详情可以参考this answer

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 2012-07-09
      • 2023-01-12
      • 2016-06-09
      • 2016-08-04
      相关资源
      最近更新 更多