我已经看到了许多用于使用IConfiguration
检索秘密的Azure密钥库的示例,但是这些主要涉及查看秘密而不是Crud类型操作。
我正在尝试使用IKeyVaultClient
扩展方法,例如GetSecretAsync
在此处描述。为了实现这一点
- 创建一个公共
IKeyVaultOps
接口和KeyVaultOps
实现包含KeyVaultClient
的公共类。
keyVaultops.cs
public class KeyVaultOps : IKeyVaultOps
{
public KeyVaultClient GetKeyVaultClient()
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
return new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
}
}
- 在必要时使用DI注入:
startup.cs
services.AddSingleton<IKeyVaultOps, KeyVaultOps>();
剃须刀页面:
private readonly IKeyVaultOps keyVaultOps;
private readonly IConfiguration configuration;
public TestPageModel(
IKeyVaultOps keyVaultOps,
IConfiguration configuration
)
{
this.keyVaultOps = keyVaultOps;
this.configuration = configuration;
}
public string Secret { get; set; }
public class TestPageModel : PageModel
{
public async Task OnGetAsync()
{
try
{
var vaultUrl = configuration["KeyVaultUrl"];
SecretBundle secretBundle = await keyVaultOps.GetKeyVaultClient().GetSecretAsync(vaultUrl, "TestSecret");
Secret = secretBundle.Value;
}
catch (Exception ex)
{
Secret = ex.Message;
}
}
}
认识到我实际上不需要界面才能正确工作,我正在寻找有关两件事的建议:
是否有一种更好的方法来配置
KeyVaultClient
URL属性,而不是在我需要实现的每个类上注入IConfiguration
?由于我的主要项目无论如何都有
using
的CC_9语句,因此是否可以避免我自己的GetKeyVaultClient()
实现,并且简单地使用:services.AddSingleton<IKeyVaultClient, KeyVaultClient>();
...以及必要的扩展方法?
注意:Startup.cs
中的上线产生:
可以使用服务容器中的服务和默认值
实例化类型的'Microsoft.azure.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.keyvault.ply
我喜欢创建自己的服务,以访问为我处理URL和auth件的密钥库,因此我的代码可以简单地使用该服务而无需考虑配置。它的工作原理:
public interface IMyKeyVaultClient {
Task<SecretBundle> GetSecretAsync(string secretName);
}
public class MyKeyVaultClient : IMyKeyVaultClient {
public MyKeyVaultClient(IConfiguration config, IWhateverElseYouNeedForGettingCredentials otherStuff) {
//snag the URL from config and credentials from otherStuff
//instantiate keyVaultClient;
}
private KeyVaultClient keyVaultClient;
private string url;
public Task<SecretBundle> GetSecretAsync(string secretName) {
return keyVaultClient.GetSecretAsync(url, secretName);
}
}
然后注册您的服务,
services.AddSingleton<IMyKeyVaultClient, MyKeyVaultClient>();
然后,您的调用代码可以简单地从DI请求IMyKeyVaultClient
,并以秘密名称调用GetSecretAsync()
,而不必担心详细信息。