33
44using System ;
55using System . Collections . Generic ;
6+ using System . IdentityModel . Tokens . Jwt ;
7+ using System . Linq ;
68using System . Net . Http ;
79using System . Text . Json ;
810using System . Threading . Tasks ;
@@ -60,6 +62,19 @@ public async Task CrossCloudFicIntegrationTest()
6062 // Assert
6163 Assert . NotNull ( result ) ;
6264 Assert . StartsWith ( "Bearer" , result , StringComparison . Ordinal ) ;
65+
66+ // Decode token & verify xms_cc
67+ string jwt = result [ "Bearer " . Length ..] . Trim ( ) ;
68+
69+ var handler = new JwtSecurityTokenHandler ( ) ;
70+ var token = handler . ReadJwtToken ( jwt ) ;
71+
72+ var xmsCcValues = token . Claims
73+ . Where ( c => c . Type == "xms_cc" )
74+ . Select ( c => c . Value )
75+ . ToArray ( ) ;
76+
77+ Assert . Contains ( "cp1" , xmsCcValues ) ;
6378 }
6479
6580 //[Fact(Skip ="Does not run if run with the E2E test")]
@@ -96,6 +111,7 @@ public async Task CrossCloudFicUnitTest()
96111 options . Instance = "https://login.microsoftonline.com/" ;
97112 options . TenantId = "t2" ;
98113 options . ClientId = "c2" ;
114+ options . ClientCapabilities = [ "cp1" ] ;
99115 options . ExtraQueryParameters = null ;
100116 options . ClientCredentials = [ new CredentialDescription ( ) {
101117 SourceType = CredentialSource . CustomSignedAssertion ,
@@ -121,6 +137,28 @@ public async Task CrossCloudFicUnitTest()
121137 Assert . Equal ( "c2" , tokenRequestHttpHandler . ActualRequestPostData [ "client_id" ] ) ;
122138 Assert . Equal ( "https://login.microsoftonline.com/t2/oauth2/v2.0/token" , tokenRequestHttpHandler . ActualRequestMessage ? . RequestUri ? . AbsoluteUri ) ;
123139
140+ // First request (credential exchange) – should have *no* "claims"
141+ Assert . False ( credentialRequestHttpHandler . ActualRequestPostData
142+ . ContainsKey ( "claims" ) ) ;
143+
144+ // Second request (real token acquisition) – must carry "claims"
145+ Assert . True ( tokenRequestHttpHandler . ActualRequestPostData
146+ . ContainsKey ( "claims" ) ) ;
147+
148+ // Extract and inspect the JSON payload
149+ string claimsJson = tokenRequestHttpHandler . ActualRequestPostData [ "claims" ] ;
150+
151+ using JsonDocument doc = JsonDocument . Parse ( claimsJson ) ;
152+
153+ string ? cp = doc . RootElement
154+ . GetProperty ( "access_token" )
155+ . GetProperty ( "xms_cc" )
156+ . GetProperty ( "values" ) [ 0 ]
157+ . GetString ( ) ;
158+
159+ // Ensure that the client capabilities are passed in the claims
160+ Assert . Equal ( "cp1" , cp ) ;
161+
124162 string ? accessTokenFromRequest1 ;
125163 using ( JsonDocument document = JsonDocument . Parse ( credentialRequestHttpHandler . ResponseString ) )
126164 {
0 commit comments