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

私はこの答えが間違っていると信じています。結果には秘密の値は含まれません。ちょうどids、あなたは秘密それ自体を得るために別の往復が必要です。 GetSecrets()は秘密の値を含まないSecretItemのコレクトを返します(SecretBundle does) – BobbyTables