尝试从 Asp.net 核心中的 Azure 密钥保管库访问对象值
Trying to access the object value from Azure key vault in Asp.net core
我在 Azure 的密钥保管库密钥中有一个对象值,并试图在启动时读取该值 class 但该值始终为空。
Program.cs
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
config.AddAzureKeyVault(
vaultConfig.AzureVaultUrl,
keyVaultClient,
new DefaultKeyVaultSecretManager());
Startup.cs
public virtual void ConfigureSettings(IServiceCollection services)
{
services.AddOptions();
services.Configure<OktaConfig>(Configuration.GetSection("OktaConfig")); // Read the value from Azure Key Vault or %APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json for Dev Environment
}
Controller.cs
public class SystemController
{
private readonly IConfiguration _config;
private readonly OktaConfig _oktaConfig;
public SystemController(IConfiguration config, IOptions<OktaConfig> oktaConfig)
{
_config = config;
_oktaConfig = oktaConfig.Value; // This value is null
}
[HttpGet("Vaults")]
public IActionResult GetVaultValues()
{
var OktaConfig = JsonConvert.DeserializeObject<OktaConfig>(_config["OktaConfig"]);
return Ok(OktaConfig);
}
_oktaConfig 值始终为空。
这是我的 Azure Key Vault 值
Json密钥秘密值的结构
{
"OktaDomain": "https://dev-166545.okta.com/oauth2/XXXXXXXXXXXXXXXXX/v1/authorize",
"ClientId": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"ClientSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"redirectUrl": "https://localhost:44307"
}
ViewModel.cs
public class OktaConfig
{
public string RedirectUrl { get; set; }
public string OktaDomain { get; set; }
public string ClientId { get; set; }
public string ClientSecret { get; set; }
public string ClientName { get; set; }
}
使用这个 _config["OktaConfig"] 代码我可以得到这个值,但我想为此做依赖注入。
您想将 key/value 从 KeyVault 映射到嵌套配置,这是不可能的。默认情况下,所有机密都写入根配置。但是,netcore 中的 IConfiguration
实现具有如何实现此功能的功能。
例如,当您设置键 "Section1:Key1" 时,部分 "Section1" 键 'Key1' 被设置。
Configuration["Section1:Key1"]="value"
var section1 = Configuration.GetSection("Section1");
现在只需要将KeyVault中的配置以这种格式写入Configuration对象即可。 DefaultKeyVaultSecretManager
class 可以为您完成此转换,只需将密钥以适当的格式保存在 KeyVault 中即可。只需写分隔符 '--' 而不是 ':'
在我的示例中,您将使用 'Section1--Key1'.
This article 是有关此主题的非常好的信息来源。
我在我这边做了一个快速测试,这是我的OktaConfig
快速测试:
public class OktaConfig
{
public string RedirectUrl { get; set; }
}
密钥库中的秘密:
其他代码和你一样。但是在 Startup.cs
中,我使用下面的代码注入 OktaConfig 并添加到 services
:
services.AddSingleton<OktaConfig>(sp =>
{
var resultJson = Configuration.GetSection("<your secret name in kv>").Value;
return JsonConvert.DeserializeObject<OktaConfig>(resultJson);
});
控制器中的代码:
private readonly ILogger<HomeController> _logger;
private OktaConfig oktaConfig;
public HomeController(ILogger<HomeController> logger , OktaConfig oktaConfig)
{
this.oktaConfig = oktaConfig;
_logger = logger;
}
public IActionResult Index()
{
return Ok(oktaConfig.RedirectUrl);
}
结果:
希望对您有所帮助。
我在 Azure 的密钥保管库密钥中有一个对象值,并试图在启动时读取该值 class 但该值始终为空。
Program.cs
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
config.AddAzureKeyVault(
vaultConfig.AzureVaultUrl,
keyVaultClient,
new DefaultKeyVaultSecretManager());
Startup.cs
public virtual void ConfigureSettings(IServiceCollection services)
{
services.AddOptions();
services.Configure<OktaConfig>(Configuration.GetSection("OktaConfig")); // Read the value from Azure Key Vault or %APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json for Dev Environment
}
Controller.cs
public class SystemController
{
private readonly IConfiguration _config;
private readonly OktaConfig _oktaConfig;
public SystemController(IConfiguration config, IOptions<OktaConfig> oktaConfig)
{
_config = config;
_oktaConfig = oktaConfig.Value; // This value is null
}
[HttpGet("Vaults")]
public IActionResult GetVaultValues()
{
var OktaConfig = JsonConvert.DeserializeObject<OktaConfig>(_config["OktaConfig"]);
return Ok(OktaConfig);
}
_oktaConfig 值始终为空。
这是我的 Azure Key Vault 值
Json密钥秘密值的结构
{
"OktaDomain": "https://dev-166545.okta.com/oauth2/XXXXXXXXXXXXXXXXX/v1/authorize",
"ClientId": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"ClientSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"redirectUrl": "https://localhost:44307"
}
ViewModel.cs
public class OktaConfig
{
public string RedirectUrl { get; set; }
public string OktaDomain { get; set; }
public string ClientId { get; set; }
public string ClientSecret { get; set; }
public string ClientName { get; set; }
}
使用这个 _config["OktaConfig"] 代码我可以得到这个值,但我想为此做依赖注入。
您想将 key/value 从 KeyVault 映射到嵌套配置,这是不可能的。默认情况下,所有机密都写入根配置。但是,netcore 中的 IConfiguration
实现具有如何实现此功能的功能。
例如,当您设置键 "Section1:Key1" 时,部分 "Section1" 键 'Key1' 被设置。
Configuration["Section1:Key1"]="value"
var section1 = Configuration.GetSection("Section1");
现在只需要将KeyVault中的配置以这种格式写入Configuration对象即可。 DefaultKeyVaultSecretManager
class 可以为您完成此转换,只需将密钥以适当的格式保存在 KeyVault 中即可。只需写分隔符 '--' 而不是 ':'
在我的示例中,您将使用 'Section1--Key1'.
This article 是有关此主题的非常好的信息来源。
我在我这边做了一个快速测试,这是我的OktaConfig
快速测试:
public class OktaConfig
{
public string RedirectUrl { get; set; }
}
密钥库中的秘密:
其他代码和你一样。但是在 Startup.cs
中,我使用下面的代码注入 OktaConfig 并添加到 services
:
services.AddSingleton<OktaConfig>(sp =>
{
var resultJson = Configuration.GetSection("<your secret name in kv>").Value;
return JsonConvert.DeserializeObject<OktaConfig>(resultJson);
});
控制器中的代码:
private readonly ILogger<HomeController> _logger;
private OktaConfig oktaConfig;
public HomeController(ILogger<HomeController> logger , OktaConfig oktaConfig)
{
this.oktaConfig = oktaConfig;
_logger = logger;
}
public IActionResult Index()
{
return Ok(oktaConfig.RedirectUrl);
}
结果:
希望对您有所帮助。