@@ -522,6 +522,47 @@ public void RemoveUser(IAzureAccount account, IAzureTokenCache tokenCache)
522
522
}
523
523
}
524
524
525
+ /// <summary>
526
+ /// Remove any stored credentials for the given user and the Azure environment used.
527
+ /// </summary>
528
+ /// <param name="account">The account to remove credentials for</param>
529
+ /// <param name="authority">The Microsoft Entra authority</param>
530
+ public void RemoveUser ( IAzureAccount account , string authority )
531
+ {
532
+ if ( account != null && ! string . IsNullOrEmpty ( account . Id ) && ! string . IsNullOrWhiteSpace ( account . Type ) )
533
+ {
534
+ switch ( account . Type )
535
+ {
536
+ case AzureAccount . AccountType . AccessToken :
537
+ account . SetProperty ( AzureAccount . Property . AccessToken , null ) ;
538
+ account . SetProperty ( AzureAccount . Property . GraphAccessToken , null ) ;
539
+ account . SetProperty ( AzureAccount . Property . KeyVaultAccessToken , null ) ;
540
+ break ;
541
+ case AzureAccount . AccountType . ManagedService :
542
+ account . SetProperty ( AzureAccount . Property . MSILoginUri , null ) ;
543
+ break ;
544
+ case AzureAccount . AccountType . ServicePrincipal :
545
+ try
546
+ {
547
+ KeyStore . RemoveSecureString ( new ServicePrincipalKey ( AzureAccount . Property . ServicePrincipalSecret ,
548
+ account . Id , account . GetTenants ( ) . FirstOrDefault ( ) ) ) ;
549
+ KeyStore . RemoveSecureString ( new ServicePrincipalKey ( AzureAccount . Property . CertificatePassword ,
550
+ account . Id , account . GetTenants ( ) . FirstOrDefault ( ) ) ) ;
551
+ }
552
+ catch
553
+ {
554
+ // make best effort to remove credentials
555
+ }
556
+
557
+ RemoveFromTokenCache ( account , authority ) ;
558
+ break ;
559
+ case AzureAccount . AccountType . User :
560
+ RemoveFromTokenCache ( account , authority ) ;
561
+ break ;
562
+ }
563
+ }
564
+ }
565
+
525
566
private string GetResourceId ( string resourceIdorEndpointName , IAzureEnvironment environment )
526
567
{
527
568
return environment . GetEndpoint ( resourceIdorEndpointName ) ?? resourceIdorEndpointName ;
@@ -558,20 +599,20 @@ private string GetEndpointToken(IAzureAccount account, string targetEndpoint)
558
599
return account . GetProperty ( tokenKey ) ;
559
600
}
560
601
561
- private void RemoveFromTokenCache ( IAzureAccount account )
602
+ private void RemoveFromTokenCache ( IAzureAccount account , string authority = null )
562
603
{
563
604
PowerShellTokenCacheProvider tokenCacheProvider ;
564
605
if ( ! AzureSession . Instance . TryGetComponent ( PowerShellTokenCacheProvider . PowerShellTokenCacheProviderKey , out tokenCacheProvider ) )
565
606
{
566
607
throw new NullReferenceException ( Resources . AuthenticationClientFactoryNotRegistered ) ;
567
608
}
568
609
569
- var publicClient = tokenCacheProvider . CreatePublicClient ( ) ;
610
+ var publicClient = tokenCacheProvider . CreatePublicClient ( authority ) ;
570
611
var accounts = publicClient . GetAccountsAsync ( )
571
612
. ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ;
572
613
var tokenAccounts = accounts . Where ( a => MatchCacheItem ( account , a ) ) ;
573
614
foreach ( var tokenAccount in tokenAccounts )
574
- {
615
+ {
575
616
publicClient . RemoveAsync ( tokenAccount )
576
617
. ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ;
577
618
}
0 commit comments