.NET 6 Azure KeyVault: запрещенная ошибка 403

Я пытаюсь получить доступ к 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;
        }

Вот ошибка:

.NET 6 Azure KeyVault: запрещенная ошибка 403

Это роли, назначенные на уровне подписки Azure:

.NET 6 Azure KeyVault: запрещенная ошибка 403

Зарегистрированное приложение под Microsoft Entra Id и предоставленные разрешения API для этого приложения:

.NET 6 Azure KeyVault: запрещенная ошибка 403

Я пробовал много способов вставки ключей, но безуспешно. Может ли кто-нибудь подсказать, какую конфигурацию мне не хватает или пропустил при создании ресурса?

Пожалуйста, замените изображения кода реальным кодом. Дополнительную информацию о том, как задавать хорошие вопросы, которые привлекают ответы, см.: stackoverflow.com/help/how-to-ask

galdin 17.08.2024 10:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка возникает, если для регистрации вызывающего приложения не назначены обязательные роли в 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");
    }
}

Ответ:

Чтобы подтвердить это, я проверил то же самое на портале, где секрет был успешно создан следующим образом:

спасибо за помощь.

Varanasi Phaneendra 19.08.2024 10:34

Другие вопросы по теме