Skip to content

Commit e76c1e5

Browse files
add tests for xms_cc (#3351)
Co-authored-by: Gladwin Johnson <gljohns@microsoft.com>
1 parent 180ec45 commit e76c1e5

3 files changed

Lines changed: 45 additions & 1 deletion

File tree

src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,11 @@ private async Task<IConfidentialClientApplication> BuildConfidentialClientApplic
820820
builder.WithRedirectUri(currentUri);
821821
}
822822

823+
// ClientCapabilities are applied once during CCA construction
824+
// (see UpdateConfidentialClientApplicationOptionsFromMergedOptions).
825+
// We rely on that path. if it ever regresses the unit test
826+
// (CrossCloudFicUnitTest) will fail.
827+
823828
string authority;
824829

825830
if (mergedOptions.PreserveAuthority && !string.IsNullOrEmpty(mergedOptions.Authority))

tests/E2E Tests/OidcIdPSignedAssertionProviderTests/OidCIdPSignedAssertionProviderExtensibilityTests.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.IdentityModel.Tokens.Jwt;
7+
using System.Linq;
68
using System.Net.Http;
79
using System.Text.Json;
810
using 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
{

tests/E2E Tests/OidcIdPSignedAssertionProviderTests/appsettings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
"AzureAd": {
44
"Instance": "https://login.microsoftonline.com/",
55
"TenantId": "msidlab4.onmicrosoft.com",
6-
"ExtraQueryParameters": { "dc": "ESTS-PUB-WEULR1-AZ1-FD000-TEST1" },
6+
"ExtraQueryParameters": { "dc": "ESTS-PUB-WEULR1-AZ1-FD000-TEST1" },
77
"ClientId": "5e71875b-ae52-4a3c-8b82-f6fdc8e1dbe1", // this app is configured to trust credentials (tokens) from f6b698c0-140c-448f-8155-4aa9bf77ceba
8+
"ClientCapabilities": [ "cp1" ],
89
"ClientCredentials": [
910
{
1011
"SourceType": "CustomSignedAssertion",

0 commit comments

Comments
 (0)