@@ -64,22 +64,7 @@ public IAccessToken Authenticate(
64
64
configuration . ValidateAuthority ) ;
65
65
if ( account != null && account . Type == AzureAccount . AccountType . ManagedService )
66
66
{
67
- if ( environment == null )
68
- {
69
- throw new InvalidOperationException ( "Environment is required for MSI Login" ) ;
70
- }
71
-
72
- if ( ! account . IsPropertySet ( AzureAccount . Property . MSILoginUri ) )
73
- {
74
- account . SetProperty ( AzureAccount . Property . MSILoginUri , DefaultMSILoginUri ) ;
75
- }
76
-
77
- if ( string . IsNullOrWhiteSpace ( tenant ) )
78
- {
79
- tenant = environment . AdTenant ?? "Common" ;
80
- }
81
-
82
- token = new ManagedServiceAccessToken ( account , environment , GetResourceId ( resourceId , environment ) , tenant ) ;
67
+ token = GetManagedServiceToken ( account , environment , tenant , resourceId ) ;
83
68
}
84
69
else if ( account != null && environment != null
85
70
&& account . Type == AzureAccount . AccountType . AccessToken )
@@ -144,12 +129,12 @@ public IAccessToken Authenticate(
144
129
string resourceId = AzureEnvironment . Endpoint . ActiveDirectoryServiceEndpointResourceId )
145
130
{
146
131
return Authenticate (
147
- account ,
148
- environment ,
149
- tenant , password ,
150
- promptBehavior ,
151
- promptAction ,
152
- AzureSession . Instance . TokenCache ,
132
+ account ,
133
+ environment ,
134
+ tenant , password ,
135
+ promptBehavior ,
136
+ promptAction ,
137
+ AzureSession . Instance . TokenCache ,
153
138
resourceId ) ;
154
139
}
155
140
@@ -176,19 +161,16 @@ public SubscriptionCloudCredentials GetSubscriptionCloudCredentials(IAzureContex
176
161
throw new ArgumentException ( exceptionMessage ) ;
177
162
}
178
163
179
- if ( context . Account . Type == AzureAccount . AccountType . Certificate )
164
+ switch ( context . Account . Type )
180
165
{
181
- var certificate = AzureSession . Instance . DataStore . GetCertificate ( context . Account . Id ) ;
182
- return new CertificateCloudCredentials ( context . Subscription . Id . ToString ( ) , certificate ) ;
183
- }
184
-
185
- if ( context . Account . Type == AzureAccount . AccountType . AccessToken )
186
- {
187
- return new TokenCloudCredentials ( context . Subscription . Id . ToString ( ) , GetEndpointToken ( context . Account , targetEndpoint ) ) ;
166
+ case AzureAccount . AccountType . Certificate :
167
+ var certificate = AzureSession . Instance . DataStore . GetCertificate ( context . Account . Id ) ;
168
+ return new CertificateCloudCredentials ( context . Subscription . Id . ToString ( ) , certificate ) ;
169
+ case AzureAccount . AccountType . AccessToken :
170
+ return new TokenCloudCredentials ( context . Subscription . Id . ToString ( ) , GetEndpointToken ( context . Account , targetEndpoint ) ) ;
188
171
}
189
172
190
173
string tenant = null ;
191
-
192
174
if ( context . Subscription != null && context . Account != null )
193
175
{
194
176
tenant = context . Subscription . GetPropertyAsArray ( AzureSubscription . Property . Tenants )
@@ -251,6 +233,7 @@ public SubscriptionCloudCredentials GetSubscriptionCloudCredentials(IAzureContex
251
233
}
252
234
}
253
235
236
+
254
237
public ServiceClientCredentials GetServiceClientCredentials ( IAzureContext context )
255
238
{
256
239
return GetServiceClientCredentials ( context ,
@@ -263,16 +246,14 @@ public ServiceClientCredentials GetServiceClientCredentials(IAzureContext contex
263
246
{
264
247
throw new ArgumentException ( Resources . ArmAccountNotFound ) ;
265
248
}
266
-
267
- if ( context . Account . Type == AzureAccount . AccountType . Certificate )
249
+ switch ( context . Account . Type )
268
250
{
269
- throw new NotSupportedException ( AzureAccount . AccountType . Certificate . ToString ( ) ) ;
251
+ case AzureAccount . AccountType . Certificate :
252
+ throw new NotSupportedException ( AzureAccount . AccountType . Certificate . ToString ( ) ) ;
253
+ case AzureAccount . AccountType . AccessToken :
254
+ return new TokenCredentials ( GetEndpointToken ( context . Account , targetEndpoint ) ) ;
270
255
}
271
256
272
- if ( context . Account . Type == AzureAccount . AccountType . AccessToken )
273
- {
274
- return new TokenCredentials ( GetEndpointToken ( context . Account , targetEndpoint ) ) ;
275
- }
276
257
277
258
string tenant = null ;
278
259
@@ -317,41 +298,47 @@ public ServiceClientCredentials GetServiceClientCredentials(IAzureContext contex
317
298
}
318
299
319
300
ServiceClientCredentials result = null ;
320
-
321
- if ( context . Account . Type == AzureAccount . AccountType . User )
322
- {
323
- result = Rest . Azure . Authentication . UserTokenProvider . CreateCredentialsFromCache (
324
- AdalConfiguration . PowerShellClientId ,
325
- tenant ,
326
- context . Account . Id ,
327
- env ,
328
- tokenCache as TokenCache ) . ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ;
329
- }
330
- else if ( context . Account . Type == AzureAccount . AccountType . ServicePrincipal )
331
- {
332
- if ( context . Account . IsPropertySet ( AzureAccount . Property . CertificateThumbprint ) )
333
- {
334
- result = ApplicationTokenProvider . LoginSilentAsync (
335
- tenant ,
336
- context . Account . Id ,
337
- new CertificateApplicationCredentialProvider (
338
- context . Account . GetThumbprint ( ) ) ,
339
- env ,
340
- tokenCache as TokenCache ) . ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ;
341
- }
342
- else
343
- {
344
- result = ApplicationTokenProvider . LoginSilentAsync (
345
- tenant ,
346
- context . Account . Id ,
347
- new KeyStoreApplicationCredentialProvider ( tenant ) ,
348
- env ,
349
- tokenCache as TokenCache ) . ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ;
350
- }
351
- }
352
- else
301
+ switch ( context . Account . Type )
353
302
{
354
- throw new NotSupportedException ( context . Account . Type . ToString ( ) ) ;
303
+ case AzureAccount . AccountType . ManagedService :
304
+ result = new RenewingTokenCredential (
305
+ GetManagedServiceToken (
306
+ context . Account ,
307
+ context . Environment ,
308
+ tenant ,
309
+ context . Environment . GetTokenAudience ( targetEndpoint ) ) ) ;
310
+ break ;
311
+ case AzureAccount . AccountType . User :
312
+ result = Rest . Azure . Authentication . UserTokenProvider . CreateCredentialsFromCache (
313
+ AdalConfiguration . PowerShellClientId ,
314
+ tenant ,
315
+ context . Account . Id ,
316
+ env ,
317
+ tokenCache as TokenCache ) . ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ;
318
+ break ;
319
+ case AzureAccount . AccountType . ServicePrincipal :
320
+ if ( context . Account . IsPropertySet ( AzureAccount . Property . CertificateThumbprint ) )
321
+ {
322
+ result = ApplicationTokenProvider . LoginSilentAsync (
323
+ tenant ,
324
+ context . Account . Id ,
325
+ new CertificateApplicationCredentialProvider (
326
+ context . Account . GetThumbprint ( ) ) ,
327
+ env ,
328
+ tokenCache as TokenCache ) . ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ;
329
+ }
330
+ else
331
+ {
332
+ result = ApplicationTokenProvider . LoginSilentAsync (
333
+ tenant ,
334
+ context . Account . Id ,
335
+ new KeyStoreApplicationCredentialProvider ( tenant ) ,
336
+ env ,
337
+ tokenCache as TokenCache ) . ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ;
338
+ }
339
+ break ;
340
+ default :
341
+ throw new NotSupportedException ( context . Account . Type . ToString ( ) ) ;
355
342
}
356
343
357
344
return result ;
@@ -363,6 +350,60 @@ public ServiceClientCredentials GetServiceClientCredentials(IAzureContext contex
363
350
}
364
351
}
365
352
353
+ public void RemoveUser ( IAzureAccount account , IAzureTokenCache tokenCache )
354
+ {
355
+ TokenCache cache = tokenCache as TokenCache ;
356
+ if ( cache != null && account != null && ! string . IsNullOrEmpty ( account . Id ) && ! string . IsNullOrWhiteSpace ( account . Type ) )
357
+ {
358
+ switch ( account . Type )
359
+ {
360
+ case AzureAccount . AccountType . AccessToken :
361
+ account . SetProperty ( AzureAccount . Property . AccessToken , null ) ;
362
+ account . SetProperty ( AzureAccount . Property . GraphAccessToken , null ) ;
363
+ account . SetProperty ( AzureAccount . Property . KeyVaultAccessToken , null ) ;
364
+ break ;
365
+ case AzureAccount . AccountType . ManagedService :
366
+ account . SetProperty ( AzureAccount . Property . MSILoginUri , null ) ;
367
+ break ;
368
+ case AzureAccount . AccountType . ServicePrincipal :
369
+ try
370
+ {
371
+ ServicePrincipalKeyStore . DeleteKey ( account . Id , account . GetTenants ( ) . FirstOrDefault ( ) ) ;
372
+ }
373
+ catch
374
+ {
375
+ // make best effort to remove credentials
376
+ }
377
+
378
+ RemoveFromTokenCache ( cache , account ) ;
379
+ break ;
380
+ case AzureAccount . AccountType . User :
381
+ RemoveFromTokenCache ( cache , account ) ;
382
+ break ;
383
+ }
384
+ }
385
+ }
386
+
387
+ private IAccessToken GetManagedServiceToken ( IAzureAccount account , IAzureEnvironment environment , string tenant , string resourceId )
388
+ {
389
+ if ( environment == null )
390
+ {
391
+ throw new InvalidOperationException ( "Environment is required for MSI Login" ) ;
392
+ }
393
+
394
+ if ( ! account . IsPropertySet ( AzureAccount . Property . MSILoginUri ) )
395
+ {
396
+ account . SetProperty ( AzureAccount . Property . MSILoginUri , DefaultMSILoginUri ) ;
397
+ }
398
+
399
+ if ( string . IsNullOrWhiteSpace ( tenant ) )
400
+ {
401
+ tenant = environment . AdTenant ?? "Common" ;
402
+ }
403
+
404
+ return new ManagedServiceAccessToken ( account , environment , GetResourceId ( resourceId , environment ) , tenant ) ;
405
+ }
406
+
366
407
private string GetResourceId ( string resourceIdorEndpointName , IAzureEnvironment environment )
367
408
{
368
409
return environment . GetEndpoint ( resourceIdorEndpointName ) ?? resourceIdorEndpointName ;
@@ -384,7 +425,7 @@ private AdalConfiguration GetAdalConfiguration(IAzureEnvironment environment, st
384
425
string . Format ( "No Active Directory endpoint specified for environment '{0}'" , environment . Name ) ) ;
385
426
}
386
427
387
- var audience = environment . GetEndpoint ( resourceId ) ?? resourceId ;
428
+ var audience = environment . GetEndpoint ( resourceId ) ?? resourceId ;
388
429
if ( string . IsNullOrWhiteSpace ( audience ) )
389
430
{
390
431
string message = Resources . InvalidManagementTokenAudience ;
@@ -410,45 +451,14 @@ private string GetEndpointToken(IAzureAccount account, string targetEndpoint)
410
451
{
411
452
string tokenKey = AzureAccount . Property . AccessToken ;
412
453
if ( targetEndpoint == AzureEnvironment . Endpoint . Graph )
413
- {
454
+ {
414
455
tokenKey = AzureAccount . Property . GraphAccessToken ;
415
456
}
416
457
417
458
return account . GetProperty ( tokenKey ) ;
418
459
}
419
460
420
- public void RemoveUser ( IAzureAccount account , IAzureTokenCache tokenCache )
421
- {
422
- TokenCache cache = tokenCache as TokenCache ;
423
- if ( cache != null && account != null && ! string . IsNullOrEmpty ( account . Id ) && ! string . IsNullOrWhiteSpace ( account . Type ) )
424
- {
425
- switch ( account . Type )
426
- {
427
- case AzureAccount . AccountType . AccessToken :
428
- account . SetProperty ( AzureAccount . Property . AccessToken , null ) ;
429
- account . SetProperty ( AzureAccount . Property . GraphAccessToken , null ) ;
430
- account . SetProperty ( AzureAccount . Property . KeyVaultAccessToken , null ) ;
431
- break ;
432
- case AzureAccount . AccountType . ServicePrincipal :
433
- try
434
- {
435
- ServicePrincipalKeyStore . DeleteKey ( account . Id , account . GetTenants ( ) . FirstOrDefault ( ) ) ;
436
- }
437
- catch
438
- {
439
- // make best effort to remove credentials
440
- }
441
-
442
- RemoveFromTokenCache ( cache , account ) ;
443
- break ;
444
- case AzureAccount . AccountType . User :
445
- RemoveFromTokenCache ( cache , account ) ;
446
- break ;
447
- }
448
- }
449
- }
450
-
451
- void RemoveFromTokenCache ( TokenCache cache , IAzureAccount account )
461
+ private void RemoveFromTokenCache ( TokenCache cache , IAzureAccount account )
452
462
{
453
463
if ( cache != null && cache . Count > 0 && account != null && ! string . IsNullOrWhiteSpace ( account . Id ) && ! string . IsNullOrWhiteSpace ( account . Type ) )
454
464
{
@@ -460,20 +470,20 @@ void RemoveFromTokenCache(TokenCache cache, IAzureAccount account )
460
470
}
461
471
}
462
472
463
- bool MatchCacheItem ( IAzureAccount account , TokenCacheItem item )
473
+ private bool MatchCacheItem ( IAzureAccount account , TokenCacheItem item )
464
474
{
465
475
bool result = false ;
466
476
if ( account != null && ! string . IsNullOrWhiteSpace ( account . Type ) && item != null )
467
477
{
468
- switch ( account . Type )
478
+ switch ( account . Type )
469
479
{
470
480
case AzureAccount . AccountType . ServicePrincipal :
471
481
result = string . Equals ( account . Id , item . ClientId , StringComparison . OrdinalIgnoreCase ) ;
472
482
break ;
473
483
case AzureAccount . AccountType . User :
474
- result = string . Equals ( account . Id , item . DisplayableId , StringComparison . OrdinalIgnoreCase )
484
+ result = string . Equals ( account . Id , item . DisplayableId , StringComparison . OrdinalIgnoreCase )
475
485
|| ( account . TenantMap != null && account . TenantMap . Any (
476
- ( m ) => string . Equals ( m . Key , item . TenantId , StringComparison . OrdinalIgnoreCase )
486
+ ( m ) => string . Equals ( m . Key , item . TenantId , StringComparison . OrdinalIgnoreCase )
477
487
&& string . Equals ( m . Value , item . UniqueId , StringComparison . OrdinalIgnoreCase ) ) ) ;
478
488
break ;
479
489
}
0 commit comments