33
44using System ;
55using System . Collections . Generic ;
6+ using System . Diagnostics . Tracing ;
67using System . IO ;
78using System . Text ;
89using System . Threading ;
910using System . Threading . Tasks ;
1011using System . Web ;
1112using Azure . Core ;
13+ using Azure . Core . Diagnostics ;
1214using Azure . Core . TestFramework ;
1315using Azure . Identity . Tests . Mock ;
1416using Microsoft . AspNetCore . Http ;
17+ using Microsoft . Diagnostics . Runtime . Interop ;
1518using NUnit . Framework ;
1619
1720namespace Azure . Identity . Tests
@@ -82,13 +85,14 @@ public async Task VerifyImdsRequestWithResourceIdMockAsync()
8285 Assert . IsTrue ( query . Contains ( "api-version=2018-02-01" ) ) ;
8386 Assert . IsTrue ( query . Contains ( $ "resource={ Uri . EscapeDataString ( ScopeUtilities . ScopesToResource ( MockScopes . Default ) ) } ") ) ;
8487 Assert . IsTrue ( request . Headers . TryGetValue ( "Metadata" , out string metadataValue ) ) ;
85- Assert . That ( Uri . UnescapeDataString ( query ) , Does . Contain ( $ "{ Constants . ManagedIdentityResourceId } ={ _expectedResourceId } ") ) ;
88+ Assert . That ( Uri . UnescapeDataString ( query ) , Does . Contain ( $ "{ Constants . ManagedIdentityResourceId } ={ _expectedResourceId } ") ) ;
8689 Assert . AreEqual ( "true" , metadataValue ) ;
8790 }
8891
8992 [ NonParallelizable ]
9093 [ Test ]
91- public async Task VerifyServiceFabricRequestWithResourceIdMockAsync ( )
94+ [ TestCaseSource ( nameof ( ResourceAndClientIds ) ) ]
95+ public async Task VerifyServiceFabricRequestWithResourceIdMockAsync ( string clientId , bool includeResourceIdentifier )
9296 {
9397 using var environment = new TestEnvVar (
9498 new ( )
@@ -101,12 +105,22 @@ public async Task VerifyServiceFabricRequestWithResourceIdMockAsync()
101105 { "IDENTITY_SERVER_THUMBPRINT" , "thumbprint" }
102106 } ) ;
103107
108+ List < string > messages = new ( ) ;
109+ using AzureEventSourceListener listener = new AzureEventSourceListener (
110+ ( _ , message ) => messages . Add ( message ) ,
111+ EventLevel . Warning ) ;
112+
104113 var response = CreateMockResponse ( 200 , ExpectedToken ) ;
105114 var mockTransport = new MockTransport ( response ) ;
106115 var options = new TokenCredentialOptions { Transport = mockTransport } ;
107116 var pipeline = CredentialPipeline . GetInstance ( options ) ;
108117
109- ManagedIdentityCredential credential = InstrumentClient ( new ManagedIdentityCredential ( new ResourceIdentifier ( _expectedResourceId ) , pipeline , true ) ) ;
118+ ManagedIdentityCredential credential = ( clientId , includeResourceIdentifier ) switch
119+ {
120+ ( Item1 : null , Item2 : true ) => InstrumentClient ( new ManagedIdentityCredential ( new ResourceIdentifier ( _expectedResourceId ) , pipeline , true ) ) ,
121+ ( Item1 : not null , Item2 : false ) => InstrumentClient ( new ManagedIdentityCredential ( clientId , pipeline , true ) ) ,
122+ _ => InstrumentClient ( new ManagedIdentityCredential ( clientId : null , pipeline , true ) )
123+ } ;
110124
111125 AccessToken actualToken = await credential . GetTokenAsync ( new TokenRequestContext ( MockScopes . Default ) ) ;
112126
@@ -119,7 +133,14 @@ public async Task VerifyServiceFabricRequestWithResourceIdMockAsync()
119133 Assert . AreEqual ( request . Uri . Host , "169.254.169.254" ) ;
120134 Assert . AreEqual ( request . Uri . Path , "/metadata/identity/oauth2/token" ) ;
121135 Assert . IsTrue ( query . Contains ( "api-version=2018-02-01" ) ) ;
122- Assert . That ( query , Does . Contain ( $ "{ Constants . ManagedIdentityResourceId } ={ Uri . EscapeDataString ( _expectedResourceId ) } ") ) ;
136+ if ( includeResourceIdentifier )
137+ {
138+ Assert . That ( query , Does . Contain ( $ "{ Constants . ManagedIdentityResourceId } ={ Uri . EscapeDataString ( _expectedResourceId ) } ") ) ;
139+ }
140+ if ( clientId != null || includeResourceIdentifier )
141+ {
142+ Assert . That ( messages , Does . Contain ( AzureIdentityEventSource . ServiceFabricManagedIdentityRuntimeConfigurationNotSupportedMessage ) ) ;
143+ }
123144 }
124145
125146 [ NonParallelizable ]
@@ -240,7 +261,7 @@ public async Task VerifyAppService2017RequestWithClientIdAndMockAsync([Values(nu
240261
241262 var response = CreateMockResponse ( 200 , ExpectedToken ) ;
242263 var mockTransport = new MockTransport ( response ) ;
243- var options = new TokenCredentialOptions ( ) { Transport = mockTransport } ;
264+ var options = new TokenCredentialOptions ( ) { Transport = mockTransport } ;
244265
245266 ManagedIdentityCredential credential = InstrumentClient ( new ManagedIdentityCredential ( clientId , options ) ) ;
246267
@@ -328,7 +349,7 @@ public async Task VerifyAppService2019RequestMockAsync()
328349 [ Test ]
329350 public async Task AllAppServiceEnvVarsSetSelects2019Api ( )
330351 {
331- using var environment = new TestEnvVar ( new ( ) { { "MSI_ENDPOINT" , "https://mock.msi.endpoint/" } , { "MSI_SECRET" , "mock-msi-secret" } , { "IDENTITY_ENDPOINT" , "https://identity.endpoint/" } , { "IDENTITY_HEADER" , "mock-identity-header" } , { "AZURE_POD_IDENTITY_AUTHORITY_HOST" , null } } ) ;
352+ using var environment = new TestEnvVar ( new ( ) { { "MSI_ENDPOINT" , "https://mock.msi.endpoint/" } , { "MSI_SECRET" , "mock-msi-secret" } , { "IDENTITY_ENDPOINT" , "https://identity.endpoint/" } , { "IDENTITY_HEADER" , "mock-identity-header" } , { "AZURE_POD_IDENTITY_AUTHORITY_HOST" , null } } ) ;
332353
333354 var response = CreateMockResponse ( 200 , ExpectedToken ) ;
334355 var mockTransport = new MockTransport ( response ) ;
@@ -386,7 +407,7 @@ public async Task VerifyAppService2019RequestWithResourceIdMockAsync()
386407
387408 var response = CreateMockResponse ( 200 , ExpectedToken ) ;
388409 var mockTransport = new MockTransport ( response ) ;
389- var options = new TokenCredentialOptions ( ) { Transport = mockTransport } ;
410+ var options = new TokenCredentialOptions ( ) { Transport = mockTransport } ;
390411 ManagedIdentityCredential credential =
391412 InstrumentClient ( new ManagedIdentityCredential ( new ResourceIdentifier ( resourceId ) , options ) ) ;
392413
@@ -444,6 +465,11 @@ public async Task VerifyCloudShellMsiRequestWithClientIdMockAsync(string clientI
444465 {
445466 using var environment = new TestEnvVar ( new ( ) { { "MSI_ENDPOINT" , "https://mock.msi.endpoint/" } , { "MSI_SECRET" , null } , { "IDENTITY_ENDPOINT" , null } , { "IDENTITY_HEADER" , null } , { "AZURE_POD_IDENTITY_AUTHORITY_HOST" , null } } ) ;
446467
468+ List < string > messages = new ( ) ;
469+ using AzureEventSourceListener listener = new AzureEventSourceListener (
470+ ( _ , message ) => messages . Add ( message ) ,
471+ EventLevel . Warning ) ;
472+
447473 var response = CreateMockResponse ( 200 , ExpectedToken ) ;
448474 var mockTransport = new MockTransport ( response ) ;
449475 var options = new TokenCredentialOptions ( ) { Transport = mockTransport } ;
@@ -467,7 +493,7 @@ public async Task VerifyCloudShellMsiRequestWithClientIdMockAsync(string clientI
467493 Assert . IsTrue ( body . Contains ( $ "resource={ Uri . EscapeDataString ( ScopeUtilities . ScopesToResource ( MockScopes . Default ) ) } ") ) ;
468494 if ( clientId != null )
469495 {
470- Assert . IsTrue ( body . Contains ( $ " { Constants . ManagedIdentityClientId } =mock-client-id" ) ) ;
496+ Assert . That ( messages , Does . Contain ( string . Format ( AzureIdentityEventSource . UserAssignedManagedIdentityNotSupportedMessage , "Cloud Shell" ) ) ) ;
471497 }
472498 Assert . IsTrue ( request . Headers . TryGetValue ( "Metadata" , out string actMetadata ) ) ;
473499 Assert . AreEqual ( "true" , actMetadata ) ;
@@ -510,7 +536,7 @@ public async Task VerifyMsiUnavailableOnIMDSRequestFailedExcpetion()
510536
511537 [ NonParallelizable ]
512538 [ Test ]
513- public async Task VerifyMsiUnavailableOnIMDSGatewayErrorResponse ( [ Values ( 502 , 504 ) ] int statusCode )
539+ public async Task VerifyMsiUnavailableOnIMDSGatewayErrorResponse ( [ Values ( 502 , 504 ) ] int statusCode )
514540 {
515541 using var server = new TestServer ( context =>
516542 {
@@ -658,7 +684,7 @@ public async Task VerifyClientAuthenticateReturnsErrorResponse()
658684 } ) ;
659685 var errorMessage = "Some error happened" ;
660686 var mockTransport = new MockTransport ( request => CreateErrorMockResponse ( 404 , errorMessage ) ) ;
661- var options = new TokenCredentialOptions { Transport = mockTransport } ;
687+ var options = new TokenCredentialOptions { Transport = mockTransport } ;
662688 options . Retry . MaxDelay = TimeSpan . Zero ;
663689 var pipeline = CredentialPipeline . GetInstance ( options ) ;
664690
@@ -684,6 +710,13 @@ public async Task VerifyAuthenticationFailedExceptionsAreDeferredToGetToken(Dict
684710 await Task . CompletedTask ;
685711 }
686712
713+ private static IEnumerable < TestCaseData > ResourceAndClientIds ( )
714+ {
715+ yield return new TestCaseData ( new object [ ] { null , false } ) ;
716+ yield return new TestCaseData ( new object [ ] { "mock-client-id" , false } ) ;
717+ yield return new TestCaseData ( new object [ ] { null , true } ) ;
718+ }
719+
687720 private static IEnumerable < TestCaseData > ExceptionalEnvironmentConfigs ( )
688721 {
689722 // AppServiceV2017ManagedIdentitySource should throw
@@ -696,7 +729,7 @@ private static IEnumerable<TestCaseData> ExceptionalEnvironmentConfigs()
696729 yield return new TestCaseData ( new Dictionary < string , string > ( ) { { "MSI_ENDPOINT" , null } , { "MSI_SECRET" , null } , { "IDENTITY_ENDPOINT" , "http::@/bogusuri" } , { "IMDS_ENDPOINT" , "mockvalue" } , { "IDENTITY_HEADER" , null } , { "AZURE_POD_IDENTITY_AUTHORITY_HOST" , null } } ) ;
697730
698731 // ServiceFabricManagedIdentitySource should throw
699- yield return new TestCaseData ( new Dictionary < string , string > ( ) { { "MSI_ENDPOINT" , null } , { "MSI_SECRET" , null } , { "IDENTITY_ENDPOINT" , "http::@/bogusuri" } , { "IDENTITY_HEADER" , "mockvalue" } , { "IDENTITY_SERVER_THUMBPRINT" , "mockvalue" } , { "AZURE_POD_IDENTITY_AUTHORITY_HOST" , null } } ) ;
732+ yield return new TestCaseData ( new Dictionary < string , string > ( ) { { "MSI_ENDPOINT" , null } , { "MSI_SECRET" , null } , { "IDENTITY_ENDPOINT" , "http::@/bogusuri" } , { "IDENTITY_HEADER" , "mockvalue" } , { "IDENTITY_SERVER_THUMBPRINT" , "mockvalue" } , { "AZURE_POD_IDENTITY_AUTHORITY_HOST" , null } } ) ;
700733
701734 // ImdsManagedIdentitySource should throw
702735 yield return new TestCaseData ( new Dictionary < string , string > ( ) { { "MSI_ENDPOINT" , null } , { "MSI_SECRET" , null } , { "IDENTITY_ENDPOINT" , null } , { "IDENTITY_HEADER" , null } , { "IDENTITY_SERVER_THUMBPRINT" , "null" } , { "AZURE_POD_IDENTITY_AUTHORITY_HOST" , "http::@/bogusuri" } } ) ;
0 commit comments