Я использую хранилище ключей Azure для хранения некоторых конфиденциальных данных. Я предоставил в политике доступа все разрешения, в том числе и для службы приложений разработки, которая содержит серверную часть разработки. локально он работает нормально и успешно получает доступ к данным. проблема, когда я отправил обновление на сервер разработки и попробовал его, служба не работала, и весь сервер не работал. мне пришлось отменить изменения, но есть идеи, чего мне здесь не хватает? Мое приложение размещено в Azure (служба приложений), и управляемое удостоверение активировано.
вот конфигурация бэкэнда:
в appSetting.json:
"your-key-vault-name":"SanedDevKeyVault",
в program.cs:
var keyVaultName = builder.Configuration["your-key-vault-name"]; var kvUri = $"https://{keyVaultName}.vault.azure.net"; builder.Configuration.AddAzureKeyVault(new Uri(kvUri), new DefaultAzureCredential());
. со стороны Azure: я предоставил сервису приложений для серверной части необходимую ему политику доступа: политика доступа
и я добавил переменную среды в сервис приложения "your-key-vault-name":"SanedDevKeyVault",
. он работает локально, но не работает, когда я пытаюсь запустить приложение, размещенное в Azure, после добавления этих изменений.
@dode, какой язык программирования/фреймворк ты используешь для серверной части?
Можете ли вы поделиться своим кодом, который вы пробовали?
@VivekVaibhavShandilya Я использую .net 6 (проект API .net core), и он размещен на Azure. Я настроил хранилище ключей из серверной части. я отредактирую вопрос и добавлю скриншоты
@VivekVaibhavShandilya Кроме того, сетевая конфигурация хранилища ключей является общедоступной.
Для доступа к данным из Key Vault
необходимо использовать конкретный клиент Ключа, Секрета, Сертификата.
Ниже приведенный код работал у меня.
Я создал секрет и получил его значение с помощью контроллера в API.
Controllers/Keyvault.cs
:
using Azure.Security.KeyVault.Secrets;
using Microsoft.AspNetCore.Mvc;
namespace Dotnet_API.Controllers
{
[ApiController]
[Route("[controller]")]
public class KeyVault: ControllerBase
{
private readonly ILogger<KeyVault> _logger;
private readonly SecretClient _secretClient;
public KeyVault(ILogger<KeyVault> logger, SecretClient secretClient)
{
_logger = logger;
_secretClient = secretClient;
}
[HttpGet]
public async Task<IActionResult> GetSecret()
{
var secretName = "confidential";
try
{
KeyVaultSecret secret = await _secretClient.GetSecretAsync(secretName);
return Ok(new { SecretValue = secret.Value });
}
catch (Exception ex)
{
return StatusCode(StatusCodes.Status500InternalServerError, new { Message = ex.Message });
}
}
}
}
Program.cs
:
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddControllers();
var KeyVaultUrl = builder.Configuration["KeyVault:Url"];
var secret = builder.Services.AddSingleton(new SecretClient(new Uri(KeyVaultUrl), new DefaultAzureCredential()));
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
appsettings.json
:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"KeyVault": {
"Url": "https://vivekkeyvault.vault.azure.net"
}
}
Чтобы разрешить доступ веб-приложению в хранилище ключей, выполните следующие действия:
Моя секретная ценность:
OUTPUT
:Локально:
с развязностью
без развязности
Лазурный:
Итак, для таких переменных в моем коде, который ожидает значения секретов, определенных в хранилище ключей var client_id = _configuration["HID:HIDClientId"].ToString() ?? ""; var client_secret = _configuration["HID:HIDSecretKey"].ToString() ?? ""; var grant_type = _configuration["HID:HIDGrantType"].ToString() ?? "";
, я не должен оставлять это так, как ожидается, что _configuration будет иметь свое значение. вместо этого я должен использовать API хранилища ключей, который вы только что определили, верно?
Да, именно так вы можете получить значения секрета из хранилища ключей.
Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Поскольку сейчас написано, трудно точно сказать, о чем вы спрашиваете.