Azure Function w/ User-Assigned Managed Identity 从 Key Vault 检索机密在本地工作但在 Azure 门户中失败

Azure Function w/ User-Assigned Managed Identity retrieves secrets from Key Vault works locally but fails in Azure Portal

我创建了一个 Azure 函数,它使用 user-assigned 托管身份从 Azure Key Vault 检索机密。当我在 Visual Studio 中测试时,代码在本地工作,但当我发布到云时失败。我在 Azure 中创建了一个 'Managed Identity' 资源,并向托管标识添加了一个 'Key Vault Contributor' 角色分配。在我的 Azure 功能中,在设置>身份>用户分配下,我添加了对托管身份的引用。由于代码在本地运行并使用我的凭据通过 Key Vault 进行身份验证,因此我假设我在 Azure 门户的设置中遗漏了一些东西。任何指导将不胜感激。我很困惑,因为我已经按照 MS 文档进行了开球。

以下是我在 Azure 门户中测试该功能时收到的错误。 HTTP 响应代码:500 内部服务器错误 已执行'Function1'(失败,Id=XXXXXXXXXX,持续时间=19ms)服务请求failed.Status:400(错误请求)Headers:日期:2021 年 11 月 22 日星期一22:02:56GMTContent-Length:

我正在使用 Azure.Identity 按照此处找到的示例进行身份验证:App Authentication to Azure.Identity Migration Guidance

public static class TestManagedIdentity
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        string secret = String.Empty;
        string secretName = data.SecretName;

        azureKeyVaultURI = "https://MyKeyVault.vault.azure.net";
        var client = new SecretClient(new URI(azureKeuVaultURI), new DefaultAzureCredential());

        var secret = client.GetSecret(secretName).Value;
        log.LogInformation($"My secret value is {secret}");

        return new OkObjectResult("Success!");
    }
}

我解决了这个问题。我缺少对 Azure Managed Identity 客户端 ID 的引用。使用以下内容更新了代码。

var client = new SecretClient(new Uri(azureKeyVaultURI), new DefaultAzureCredential( new DefaultAzureCredentialOptions { ManagedIdentityClientId = clientId }));