Я пытаюсь получить доступ к Azure KeyVault и создать ключ и секрет с помощью .NET 6.
При запуске кода выдает исключение 403.
Это код:
private ResponseModel<string> CreateVaultSecretInfo(string key, string value)
{
ResponseModel<string> result = new();
try
{
var keyVaultName = config["VaultName"];
var kvUri = $"https://{keyVaultName}.vault.azure.net";
var client = new SecretClient(new Uri(kvUri), new ClientSecretCredential(config["tenantId"], config["clientId"], config["secret"]));
KeyVaultSecret resp = client.SetSecret(key, value);
logger.LogInformation("created vault secret");
}
catch (Exception ex)
{
logger.LogError("exception occured" + ex.Message);
throw;
}
return result;
}
Вот ошибка:
Это роли, назначенные на уровне подписки Azure:
Зарегистрированное приложение под Microsoft Entra Id и предоставленные разрешения API для этого приложения:
Я пробовал много способов вставки ключей, но безуспешно. Может ли кто-нибудь подсказать, какую конфигурацию мне не хватает или пропустил при создании ресурса?
Ошибка возникает, если для регистрации вызывающего приложения не назначены обязательные роли в Azure Key Vault. Проверьте, предоставили ли вы роли пользователю или приложению.
Я зарегистрировал одно приложение Entra ID с разрешениями API, предоставленными, как показано ниже:
Первоначально я тоже получил ту же ошибку, когда пытался создать секрет в Azure Key Vault, пройдя проверку подлинности в качестве субъекта-службы без назначения ему роли:
Чтобы устранить эту ошибку, обязательно назначьте правильную роль RBAC, например «Администратор хранилища ключей», для регистрации приложения следующим образом:
Когда я снова запустил код после предоставления роли приложению, секрет был успешно создан, как показано ниже:
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Microsoft.Extensions.Logging;
using System;
public class VaultService
{
private readonly SecretClient _secretClient;
private readonly ILogger<VaultService> _logger;
public VaultService(string keyVaultName, string tenantId, string clientId, string clientSecret, ILogger<VaultService> logger)
{
_logger = logger;
var kvUri = new Uri($"https://{keyVaultName}.vault.azure.net");
_secretClient = new SecretClient(kvUri, new ClientSecretCredential(tenantId, clientId, clientSecret));
}
public void CreateSecret(string key, string value)
{
try
{
_secretClient.SetSecret(key, value);
_logger.LogInformation($"Secret '{key}' created successfully.");
}
catch (Exception ex)
{
_logger.LogError("Exception occurred: " + ex.Message);
}
}
}
public class Program
{
public static void Main(string[] args)
{
using ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole();
});
ILogger<VaultService> logger = loggerFactory.CreateLogger<VaultService>();
var keyVaultName = "keyvault_name";
var tenantId = "tenantId";
var clientId = "appId";
var clientSecret = "secret";
var vaultService = new VaultService(keyVaultName, tenantId, clientId, clientSecret, logger);
vaultService.CreateSecret("secretName", "secretValue");
}
}
Ответ:
Чтобы подтвердить это, я проверил то же самое на портале, где секрет был успешно создан следующим образом:
спасибо за помощь.
Пожалуйста, замените изображения кода реальным кодом. Дополнительную информацию о том, как задавать хорошие вопросы, которые привлекают ответы, см.: stackoverflow.com/help/how-to-ask