来自本地主机 C# Web API - 从 Azure KeyVault 访问机密会引发错误 Invalid Issuer

From localhost C# Web API - Accessing secret from Azure KeyVault throws error Invalid Issuer

我正在尝试从我的本地网络 api,使用 Azure.Identity 库从 KeyVault 检索机密。 但它抛出无效的发行人。在下面给出我正在使用的代码

我现在的代码

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。

请告诉我如何解决这个问题。

这是我的代码,和你的好像没什么区别。

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. When running the code in visual studio,我们需要确保您已通过门户中的添加访问策略以具有访问 Azure Key Vault 权限的用户身份登录。或者你已经添加了用户,那么你可以检查是否为用户添加了足够的权限。

如果也失败了,您可以通过api尝试另一种访问密钥库的方法。更多详情可以参考.

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

所以在我的开发环境 (localhost) 中,我不得不使用 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 服务后,下面的代码行就足够了。所以我只使用上面的代码进行本地测试。

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