2017-03-07 69 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