C# 等待激活而不是密钥保险库秘密值(在Azure中),为什么?
我正在尝试使用Azure中的管理身份连接到我的密钥库。 为此,我在appsettings.json中的KeyVault下、vault下添加了一个带有密钥vault名称的条目。 我还对Program.cs做了以下更改,基本上添加了C# 等待激活而不是密钥保险库秘密值(在Azure中),为什么?,c#,azure,azure-keyvault,secret-key,azure-managed-identity,C#,Azure,Azure Keyvault,Secret Key,Azure Managed Identity,我正在尝试使用Azure中的管理身份连接到我的密钥库。 为此,我在appsettings.json中的KeyVault下、vault下添加了一个带有密钥vault名称的条目。 我还对Program.cs做了以下更改,基本上添加了IConfiguration类型的变量,以帮助我阅读appsettings.json和整个ConfigureAppConfiguration部分 public IConfiguration Configuration { get; set; } public stati
IConfiguration
类型的变量,以帮助我阅读appsettings.json
和整个ConfigureAppConfiguration部分
public IConfiguration Configuration { get; set; }
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
// use Identity Management
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var keyVaultUrl = string.Format("https://{0}.vault.azure.net/", configuration.GetSection("KeyVault").GetSection("Vault").Value);
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
builder.AddAzureKeyVault(keyVaultUrl, keyVaultClient, new DefaultKeyVaultSecretManager());
var secretValue = keyVaultClient.GetSecretAsync(keyVaultUrl, "MyApp-MyDatabaseSettings--MyDatabasePassword");
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
公共IConfiguration配置{get;set;}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(生成器=>
{
//使用身份管理
var configuration=new ConfigurationBuilder().AddJsonFile(“appsettings.json”).Build();
var keyVaultUrl=string.Format(“https://{0}.vault.azure.net/”,configuration.GetSection(“KeyVault”).GetSection(“vault”).Value);
var azureServiceTokenProvider=新azureServiceTokenProvider();
var keyVaultClient=新的keyVaultClient(
新建KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback);
AddAzureKeyVault(KeyVault URL、KeyVault客户端、新的DefaultKeyVault secretManager());
var secretValue=keyVaultClient.GetSecretAsync(keyVaultUrl,“MyApp MyDatabaseSettings--MyDatabasePassword”);
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
当我将鼠标悬停在secretValue上时,会得到一个状态WaitingForActivation
(而不是实际值),知道为什么吗
编辑:我确实转到了web应用程序>身份>系统分配>并将其设置为打开。我通过以下操作使其工作:
var secretVal = Task.Run(async () => await keyVaultClient.GetSecretAsync(keyVaultUrl, "MyApp-MyDatabaseSettings--MyDatabasePassword")).Result.Value;
如果有人知道更好的方法,我会对其他答案保持开放
另外,如果在此之后您仍然存在问题,可能希望检查您是否有多个与Visual Studio关联的帐户,请转到工具-选项-搜索Azure-切换到您已登录Azure cli的正确帐户。另外,为了完成设置,使用该电子邮件地址也可以转到您的keyvault并使用Get“添加新策略”,列出机密权限,并将该电子邮件地址添加为Select principal…我通过以下操作使其工作:
var secretVal = Task.Run(async () => await keyVaultClient.GetSecretAsync(keyVaultUrl, "MyApp-MyDatabaseSettings--MyDatabasePassword")).Result.Value;
如果有人知道更好的方法,我会对其他答案保持开放
另外,如果在此之后您仍然存在问题,可能希望检查您是否有多个与Visual Studio关联的帐户,请转到工具-选项-搜索Azure-切换到您已登录Azure cli的正确帐户。另外,要完成设置,使用该电子邮件地址也可以转到您的keyvault,并使用Get“添加新策略”,列出机密权限,还可以将该电子邮件地址添加为Select principal
知道为什么吗
因为GetSecretAsync
方法是异步的,并返回一个待等待的任务。NET中的任务
表示最终返回值的异步操作
您应该等待GetSecretAsync
方法,但由于没有接受函数而不是操作的ConfigureAppConfiguration
重载,您需要在调用CreateDefaultBuilder
之前或之后返回Task
或Task
的async
方法中执行此操作
或者您可以访问结果
属性以同步阻止:
var secretVal = keyVaultClient.GetSecretAsync(keyVaultUrl,
"MyApp-MyDatabaseSettings--MyDatabasePassword").Result;
这至少比使用任务要好。运行
启动新的任务
在后台线程上执行异步方法,然后像当前一样阻止此线程
知道为什么吗
因为GetSecretAsync
方法是异步的,并返回一个待等待的任务。NET中的任务
表示最终返回值的异步操作
您应该等待GetSecretAsync
方法,但由于没有接受函数而不是操作的ConfigureAppConfiguration
重载,您需要在调用CreateDefaultBuilder
之前或之后返回Task
或Task
的async
方法中执行此操作
或者您可以访问结果
属性以同步阻止:
var secretVal = keyVaultClient.GetSecretAsync(keyVaultUrl,
"MyApp-MyDatabaseSettings--MyDatabasePassword").Result;
这至少比使用任务要好。运行
启动新的任务
在后台线程上执行异步方法,然后像当前一样阻止此线程