2017-03-07 74 views
3

我已經成功地列出了Azure KeyVault中的所有祕密 - 但是每次我想要獲得下一個祕密時,我都需要撥打電話來獲取令牌。在沒有登錄每個祕密的情況下在KeyVault中列出祕密?

如何存儲憑據,因此我只需在循環中登錄一次?

public async Task<List<string>> getsecretslist(string url) 
    { 

     var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetToken)); 

     List<string> secretlist = new List<string>(); 
     var all = kv.GetSecretsAsync(url); 
     var myId = ""; 
     foreach (Microsoft.Azure.KeyVault.Models.SecretItem someItem in all.Result) 
     { 
      myId = someItem.Id; 
      var mOtherThing = someItem.Identifier; 
      var yep = await kv.GetSecretAsync(mOtherThing.ToString()); 
      secretlist.Add(yep.Value); 
     } 

     return secretlist; 
    } 

回答

4

在您的GetToken回調方法中,只要訪問令牌有效並且沒有過期,就需要緩存訪問令牌。然後,您的回調將返回緩存的訪問令牌,而不是再次進行身份驗證。以下代碼片段將使用ADAL默認令牌緩存(例如TokenCache.DefaultShared)。

public static async Task<string> GetToken(string authority, string resource, string scope) 
 
{ 
 
    var assertionCert = new ClientAssertionCertificate(clientId, certificate); 
 
    var context = new AuthenticationContext(authority, TokenCache.DefaultShared); 
 
    var result = await context.AcquireTokenAsync(resource, assertionCert).ConfigureAwait(false); 
 

 
    return result.AccessToken; 
 
}

+0

這解決了很多問題。謝謝。 :) – Pikapops

1

您不需要在循環中調用GetSecretAsync。祕密已包含在您的結果中,請致電GetSecretsAsync。這就是你被重複認證的原因。

這是一個簡單的改變你的循環來做你正在尋找的東西。

var all = kv.GetSecretsAsync(url).GetAwaiter().GetResult(); 
foreach (var secret in all.Value) 
{ 
    secretlist.Add(secret.Id); 
} 
+0

啊!我甚至沒有注意到GetSecretsAsync和GetSecretAsync都被使用了。也將納入這一點。謝謝! – Pikapops

+2

我相信這個答案是錯誤的。結果不包含祕密值。只是ID,你需要另外一次往返才能得到這個祕密。 GetSecrets()返回一個SecretItem的集合,它不包含祕密的值(SecretBundle) – BobbyTables