Skip to content

Commit 4ece4a5

Browse files
committed
Handle No List Permission for Secrets
When the KeyVault does not have list permissions fail gracefully and wait for the individual GetSecret call to see if secret values can be retrieved. #21
1 parent 956645f commit 4ece4a5

1 file changed

Lines changed: 31 additions & 13 deletions

File tree

src/Azure/AzureKeyVaultConfigBuilder.cs

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class AzureKeyVaultConfigBuilder : KeyValueConfigBuilder
3333
private string _uri;
3434
private string _version;
3535
private bool _preload;
36+
private bool _preloadFailed;
3637

3738
private KeyVaultClient _kvClient;
3839
private List<string> _allKeys;
@@ -116,7 +117,7 @@ public override ICollection<KeyValuePair<string, string>> GetAllValues(string pr
116117

117118
private async Task<string> GetValueAsync(string key)
118119
{
119-
if (!_preload || _allKeys.Contains(key, StringComparer.OrdinalIgnoreCase))
120+
if (!_preload || _preloadFailed || _allKeys.Contains(key, StringComparer.OrdinalIgnoreCase))
120121
{
121122
try
122123
{
@@ -145,20 +146,37 @@ private async Task<string> GetValueAsync(string key)
145146
private List<string> GetAllKeys()
146147
{
147148
List<string> keys = new List<string>(); // KeyVault keys are case-insensitive. There won't be case-duplicates. List<> should be fine.
148-
149-
// Get first page of secret keys
150-
var allSecrets = Task.Run(async () => { return await _kvClient.GetSecretsAsync(_uri); }).Result;
151-
foreach (var secretItem in allSecrets)
152-
keys.Add(secretItem.Identifier.Name);
153-
154-
// If there more more pages, get those too
155-
string nextPage = allSecrets.NextPageLink;
156-
while (!String.IsNullOrWhiteSpace(nextPage))
149+
try
157150
{
158-
var moreSecrets = Task.Run(async () => { return await _kvClient.GetSecretsNextAsync(nextPage); }).Result;
159-
foreach (var secretItem in moreSecrets)
151+
// Get first page of secret keys
152+
var allSecrets = Task.Run(async () => { return await _kvClient.GetSecretsAsync(_uri); }).Result;
153+
foreach (var secretItem in allSecrets)
160154
keys.Add(secretItem.Identifier.Name);
161-
nextPage = moreSecrets.NextPageLink;
155+
156+
// If there more more pages, get those too
157+
string nextPage = allSecrets.NextPageLink;
158+
while (!String.IsNullOrWhiteSpace(nextPage))
159+
{
160+
var moreSecrets = Task.Run(async () => { return await _kvClient.GetSecretsNextAsync(nextPage); }).Result;
161+
foreach (var secretItem in moreSecrets)
162+
keys.Add(secretItem.Identifier.Name);
163+
nextPage = moreSecrets.NextPageLink;
164+
}
165+
}
166+
catch (AggregateException ae)
167+
{
168+
ae.Handle(ex =>
169+
{
170+
var exAsKve = ex as KeyVaultErrorException;
171+
// If List Permission on Secrets in not available return empty list of keys
172+
if (exAsKve != null && exAsKve.Body.Error.Code == "Forbidden")
173+
{
174+
_preloadFailed = true;
175+
return true;
176+
}
177+
else
178+
return false;
179+
});
162180
}
163181

164182
return keys;

0 commit comments

Comments
 (0)