Azure Function App 使用具有托管身份的 Key Vault 未经授权

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

我已经编写了一个函数应用程序,在代码的开头我有:

 var credential = new  ManagedIdentityCredential(); 
 var client = new SecretClient(vaultUri, credential);

在 Azure 中,我已转到函数应用程序的“身份”部分,并将系统分配的状态设置为“打开”。我还访问了密钥保管库,并通过“访问控制 (IAM)”,我将托管身份添加为密钥保管库机密用户。

在我的函数应用程序中,如果我转到那里的访问控制,我已将托管角色分配为贡献者和托管应用程序贡献者角色。

我不知道还需要设置什么才能为托管用户提供从我的应用程序内访问密钥保管库的权限。

我还将该函数全部发布为独立的。

函数应用程序的调用部分开始出现错误

结果:失败异常:Azure.RequestFailedException:调用者不是 授权对资源执行操作。如果角色分配,则拒绝 任务或角色定义最近发生了变化,请注意 传播时间。呼叫者: appid=61c8be63-9b5d-4c29-80ec-c839a0f0a61c;oid=849fa139-74c5-4adb-9b94-74b c444b68c0;iss=https://sts.windows.net/2f77693b-b7cd-4918-8d8a-d4f28910516f/ 操作:“Microsoft.KeyVault/vaults/secrets/getSecret/action”资源: '/订阅/fb54f07b-964f-4366-88e2-

azure azure-functions
1个回答
0
投票
  • 我已在功能应用程序中启用托管身份,然后通过导航到 Key vault instance -> Access Control (IAM) -> Add role assignment 授予
    Key Vault Secrets Leader
    RBAC 角色,如下所示。

enter image description here

  • 我在函数应用程序中使用以下代码来获取秘密值。
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

namespace FunctionApp6
{
    public static class Function1
    {
        [FunctionName("GetSecret")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            try
            {
                string keyVaultUrl = "https://{keyvaultName}.vault.azure.net/";

                var credential = new ManagedIdentityCredential();
                var client = new SecretClient(new Uri(keyVaultUrl), credential);

                string secretName = "testSecret"; 
                KeyVaultSecret secret = await client.GetSecretAsync(secretName);
                string secretValue = secret.Value;

                log.LogInformation($"Fetched Secret Value: {secretValue}");

                return new OkObjectResult($"Secret fetched successfully. Check logs for the value.");
            }
            catch (Exception ex)
            {
                log.LogError($"Error fetching secret: {ex.Message}");
                return new StatusCodeResult(StatusCodes.Status500InternalServerError);
            }
        }
    }
}
  • 成功获取秘值。

enter image description here

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