簡體   English   中英

WaitingForActivation 而不是密鑰保管庫機密值(在 Azure 中),為什么?

[英]WaitingForActivation instead of key vault secret value (in Azure), why?

我正在嘗試使用 Azure 中的托管身份連接到我的 Key Vault。 為此,我在 Vault 下的 KeyVault 下的 appsettings.json 中添加了一個帶有密鑰保管庫名稱的條目。 我還對我的 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>();
        });

當我 hover 超過 secretValue 時,我得到一個狀態WaitingForActivation (而不是實際值),知道為什么嗎?

編輯:我做了 go 到 web 應用程序>身份>系統分配>並將其設置為ON。

我通過這樣做使它工作:

var secretVal = Task.Run(async () => await keyVaultClient.GetSecretAsync(keyVaultUrl, "MyApp-MyDatabaseSettings--MyDatabasePassword")).Result.Value;

如果有人知道更好的方法,我將對其他答案保持開放。

PS。 如果在此之后仍然有問題,可能需要檢查是否有多個帳戶與 Visual Studio 關聯,go 到工具 - 選項 - 搜索 Azure - 切換到已登錄 ZCF04A02E37B774FC3197ZCcli 的正確帳戶。 And also to complete the setup, with that email address also go to your keyvault and "add new policy" with Get, List permissions for secrets and add also that email address as Select principal...

知道為什么嗎?

因為GetSecretAsync方法是異步的,並且返回一個待等待的Task<T> .NET 中的Task<T>表示最終返回值的異步操作。

您應該等待GetSecretAsync方法,但由於沒有接受Func<IConfigurationBuilder, Task>而不是Action<IConfigurationBuilder>ConfigureAppConfiguration重載,因此您需要在返回TaskTask<T>之前或之前的async方法中執行此操作在調用CreateDefaultBuilder之后。

或者您可以訪問Result屬性以同步阻止:

var secretVal = keyVaultClient.GetSecretAsync(keyVaultUrl, 
   "MyApp-MyDatabaseSettings--MyDatabasePassword").Result;

這至少比使用Task.Run啟動一個新的Task在后台線程上執行異步方法然后像您當前正在做的那樣阻塞該線程要好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM