DefaultAzureCredential() 不适用于应用程序注册和环境变量

问题描述 投票:0回答:1

我有一个天蓝色的功能。 要访问密钥保管库,它在云中运行时使用托管身份,但在本地运行时我尝试使用服务主体。

var credential = new DefaultAzureCredential();

我不断收到错误:

DefaultAzureCredential failed to retrieve a token from the included credentials. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/defaultazurecredential/troubleshoot

深入查看凭证对象,我看到环境凭证出现以下错误:

EnvironmentCredential authentication unavailable. Environment variables are not fully configured. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/environmentcredential/troubleshoot

我一定错过了一个步骤,所以希望得到一些帮助。到目前为止我采取的步骤是:

  1. 创建应用程序注册和秘密。
  2. 复制出client_ID、Tenant_ID 和 Secret_Value,并将它们放入我电脑上的环境变量中。我尝试了用户变量和系统变量。我可以通过日志记录代码看到 Visual Studio 可以读取变量。
  3. 我授予应用程序注册对密钥保管库的读取权限。

然而,在查看密钥库之前,在生成凭据时,会抛出错误。

我希望能得到一些关于为什么会发生这种情况的意见。

其他注意事项:

  • 我无法使用 AD 帐户,因为所有帐户都使用 MFA。
  • 我已在多个不同的网络上尝试过此操作,以确保这不是防火墙问题。
.net azure-functions visual-studio-2022 azure-app-registration
1个回答
0
投票

我遇到了同样的错误,所以我修改了代码并使用下面的代码,我可以用它来检索秘密:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace FunctionApp136
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        [Function("Function1")]
        public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");

            string rith_clientId = Environment.GetEnvironmentVariable("RITH_CLIENT_ID", EnvironmentVariableTarget.User);
            string rith_clientSecret = Environment.GetEnvironmentVariable("RITH_SECRET", EnvironmentVariableTarget.User);
            string rith_tenantId = Environment.GetEnvironmentVariable("RITH_TENANT_ID", EnvironmentVariableTarget.User);

            var credential = new ClientSecretCredential(rith_tenantId, rith_clientId, rith_clientSecret);
            var vaultUrl = "https://testvaultvb.vault.azure.net/";
            var rith_client = new SecretClient(new Uri(vaultUrl), credential);
            var rith_Keyvault_secret = "test";
            KeyVaultSecret rithout = rith_client.GetSecret(rith_Keyvault_secret);

            Console.WriteLine("Secret is:  " + rithout.Value);
            return new OkObjectResult("Welcome to Azure Functions!");
        }
    }
}

enter image description here

在上面的代码中,我从用户那里获取了环境变量值。 要从系统变量中获取值,请使用此

Environment.GetEnvironmentVariable("RITH_CLIENT_ID", EnvironmentVariableTarget.Machine);

您需要使用机器代替用户。

Output:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.