Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待激活而不是密钥保险库秘密值(在Azure中),为什么?_C#_Azure_Azure Keyvault_Secret Key_Azure Managed Identity - Fatal编程技术网

C# 等待激活而不是密钥保险库秘密值(在Azure中),为什么?

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

我正在尝试使用Azure中的管理身份连接到我的密钥库。 为此,我在appsettings.json中的KeyVault下、vault下添加了一个带有密钥vault名称的条目。 我还对Program.cs做了以下更改,基本上添加了
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;
这至少比使用
任务要好。运行
启动新的
任务
在后台线程上执行异步方法,然后像当前一样阻止此线程