我已经编写了一个函数应用程序,在代码的开头我有:
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-
Key vault instance -> Access Control (IAM) -> Add role assignment
授予 Key Vault Secrets LeaderRBAC 角色,如下所示。
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);
}
}
}
}