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 }));
我创建了一个 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 }));