@@ -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