Skip to content

Commit 0dcdc8b

Browse files
committed
Fix tenant override API not being properly used in certain confidential flows
1 parent 90af4d5 commit 0dcdc8b

File tree

9 files changed

+59
-29
lines changed

9 files changed

+59
-29
lines changed

msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/AcquireTokenInteractiveIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ void acquireTokenInteractive_ManagedUser_InstanceAware() {
108108

109109
@Test
110110
void acquireTokenInteractive_Ciam() {
111-
User user = labUserProvider.getCiamUser();
111+
User user = labUserProvider.getCiamCudUser();
112112

113113
Map<String, String> extraQueryParameters = new HashMap<>();
114114

msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/ClientCredentialsIT.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ void acquireTokenClientCredentials_ClientCertificate() throws Exception {
4848
void acquireTokenClientCredentials_ClientSecret() throws Exception {
4949
AppCredentialProvider appProvider = new AppCredentialProvider(AzureEnvironment.AZURE);
5050
final String clientId = appProvider.getLabVaultAppId();
51-
final String password = appProvider.getLabVaultPassword();
5251
IClientCredential credential = CertificateHelper.getClientCertificate();
5352

5453
assertAcquireTokenCommon(clientId, credential, TestConstants.MICROSOFT_AUTHORITY);
@@ -68,7 +67,7 @@ void acquireTokenClientCredentials_ClientAssertion() throws Exception {
6867
@Test
6968
void acquireTokenClientCredentials_ClientSecret_Ciam() throws Exception {
7069

71-
User user = labUserProvider.getCiamUser();
70+
User user = labUserProvider.getCiamCudUser();
7271
String clientId = user.getAppId();
7372

7473
AppCredentialProvider appProvider = new AppCredentialProvider(AzureEnvironment.CIAM);

msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/OnBehalfOfIT.java

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ void acquireTokenWithOBO_Managed(String environment) throws Exception {
3939
new UserAssertion(accessToken)).build()).
4040
get();
4141

42-
assertNotNull(result);
43-
assertNotNull(result.accessToken());
42+
assertResultNotNull(result);
4443
}
4544

4645
@ParameterizedTest
@@ -63,8 +62,7 @@ void acquireTokenWithOBO_testCache(String environment) throws Exception {
6362
new UserAssertion(accessToken)).build()).
6463
get();
6564

66-
assertNotNull(result1);
67-
assertNotNull(result1.accessToken());
65+
assertResultNotNull(result1);
6866

6967
// Same scope and userAssertion, should return cached tokens
7068
IAuthenticationResult result2 =
@@ -82,8 +80,7 @@ void acquireTokenWithOBO_testCache(String environment) throws Exception {
8280
new UserAssertion(accessToken)).build()).
8381
get();
8482

85-
assertNotNull(result3);
86-
assertNotNull(result3.accessToken());
83+
assertResultNotNull(result3);
8784
assertNotEquals(result2.accessToken(), result3.accessToken());
8885

8986
// Scope 2, should return cached token
@@ -105,8 +102,7 @@ void acquireTokenWithOBO_testCache(String environment) throws Exception {
105102
.build()).
106103
get();
107104

108-
assertNotNull(result5);
109-
assertNotNull(result5.accessToken());
105+
assertResultNotNull(result5);
110106
assertNotEquals(result5.accessToken(), result4.accessToken());
111107
assertNotEquals(result5.accessToken(), result2.accessToken());
112108

@@ -121,13 +117,60 @@ void acquireTokenWithOBO_testCache(String environment) throws Exception {
121117
.build()).
122118
get();
123119

124-
assertNotNull(result6);
125-
assertNotNull(result6.accessToken());
120+
assertResultNotNull(result6);
126121
assertNotEquals(result6.accessToken(), result5.accessToken());
127122
assertNotEquals(result6.accessToken(), result4.accessToken());
128123
assertNotEquals(result6.accessToken(), result2.accessToken());
129124
}
130125

126+
@Test
127+
void acquireTokenWithOBO_TenantOverride() throws Exception {
128+
cfg = new Config(AzureEnvironment.AZURE);
129+
String accessToken = this.getAccessToken();
130+
131+
final String clientId = cfg.appProvider.getOboAppId();
132+
final String password = cfg.appProvider.getOboAppPassword();
133+
134+
ConfidentialClientApplication cca =
135+
ConfidentialClientApplication.builder(clientId, ClientCredentialFactory.createFromSecret(password)).
136+
authority(cfg.tenantSpecificAuthority()).
137+
build();
138+
139+
//This token should be cached with the tenant-specific authority set at the application level
140+
IAuthenticationResult resultNoOverride = cca.acquireToken(OnBehalfOfParameters.builder(
141+
Collections.singleton(cfg.graphDefaultScope()),
142+
new UserAssertion(accessToken)).build()).
143+
get();
144+
145+
//This token should be cached with an 'organizations' authority set at the request level
146+
IAuthenticationResult resultOrganizations = cca.acquireToken(OnBehalfOfParameters.builder(
147+
Collections.singleton(cfg.graphDefaultScope()),
148+
new UserAssertion(accessToken))
149+
.tenant("organizations")
150+
.build()).
151+
get();
152+
153+
//This token should come from the cache and match the token with the 'organizations' authority
154+
IAuthenticationResult resultOrganizationsCached = cca.acquireToken(OnBehalfOfParameters.builder(
155+
Collections.singleton(cfg.graphDefaultScope()),
156+
new UserAssertion(accessToken))
157+
.tenant("organizations")
158+
.build()).
159+
get();
160+
161+
assertResultNotNull(resultNoOverride);
162+
assertResultNotNull(resultOrganizations);
163+
assertResultNotNull(resultOrganizationsCached);
164+
165+
assertNotEquals(resultNoOverride.accessToken(), resultOrganizations.accessToken());
166+
assertEquals(resultOrganizations.accessToken(), resultOrganizationsCached.accessToken());
167+
}
168+
169+
private void assertResultNotNull(IAuthenticationResult result) {
170+
assertNotNull(result);
171+
assertNotNull(result.accessToken());
172+
}
173+
131174
private String getAccessToken() throws Exception {
132175

133176
LabUserProvider labUserProvider = LabUserProvider.getInstance();

msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/UsernamePasswordIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void acquireTokenWithUsernamePassword_Ciam() throws Exception {
9494

9595
Map<String, String> extraQueryParameters = new HashMap<>();
9696

97-
User user = labUserProvider.getCiamUser();
97+
User user = labUserProvider.getCiamCudUser();
9898
PublicClientApplication pca = PublicClientApplication.builder(user.getAppId())
9999
.authority("https://" + user.getLabName() + ".ciamlogin.com/")
100100
.build();

msal4j-sdk/src/integrationtest/java/labapi/AppCredentialProvider.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ public class AppCredentialProvider {
77
private KeyVaultSecretsProvider keyVaultSecretsProvider;
88

99
private String labVaultClientId;
10-
private String labVaultPassword;
1110

1211
private String clientId;
1312

@@ -19,7 +18,6 @@ public AppCredentialProvider(String azureEnvironment) {
1918
keyVaultSecretsProvider = new KeyVaultSecretsProvider();
2019

2120
labVaultClientId = keyVaultSecretsProvider.getSecret(LabConstants.APP_ID_KEY_VAULT_SECRET);
22-
labVaultPassword = keyVaultSecretsProvider.getSecret(LabConstants.APP_PASSWORD_KEY_VAULT_SECRET);
2321

2422
switch (azureEnvironment) {
2523
case AzureEnvironment.AZURE:
@@ -65,8 +63,4 @@ public String getOboAppPassword() {
6563
public String getLabVaultAppId() {
6664
return labVaultClientId;
6765
}
68-
69-
public String getLabVaultPassword() {
70-
return labVaultPassword;
71-
}
7266
}

msal4j-sdk/src/integrationtest/java/labapi/LabConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class LabConstants {
1414
public final static String USER_MSA_USERNAME_URL = "https://msidlabs.vault.azure.net/secrets/MSA-MSIDLAB4-UserName";
1515
public final static String USER_MSA_PASSWORD_URL = "https://msidlabs.vault.azure.net/secrets/MSA-MSIDLAB4-Password";
1616
public final static String OBO_APP_PASSWORD_URL = "https://msidlabs.vault.azure.net/secrets/TodoListServiceV2-OBO";
17-
public final static String CIAM_KEY_VAULT_SECRET_KEY = "https://msidlabs.vault.azure.net/secrets/MSIDLABCIAM2-cc";
17+
public final static String CIAM_KEY_VAULT_SECRET_KEY = "https://msidlabs.vault.azure.net/secrets/MSIDLABCIAM6-cc";
1818

1919
public final static String ARLINGTON_APP_ID = "cb7faed4-b8c0-49ee-b421-f5ed16894c83";
2020
public final static String ARLINGTON_OBO_APP_ID = "c0555d2d-02f2-4838-802e-3463422e571d";

msal4j-sdk/src/integrationtest/java/labapi/LabUserProvider.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,6 @@ public User getUserByGuestHomeAzureEnvironments(String guestEnvironment, String
105105
return getLabUser(query);
106106
}
107107

108-
public User getCiamUser() {
109-
110-
UserQueryParameters query = new UserQueryParameters();
111-
query.parameters.put(UserQueryParameters.FEDERATION_PROVIDER, FederationProvider.CIAM);
112-
113-
return getLabUser(query);
114-
}
115-
116108
public User getCiamCudUser() {
117109
UserQueryParameters query = new UserQueryParameters();
118110
query.parameters.put(UserQueryParameters.FEDERATION_PROVIDER, FederationProvider.CIAMCUD);

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AcquireTokenByClientCredentialSupplier.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ AuthenticationResult execute() throws Exception {
2626
SilentParameters parameters = SilentParameters
2727
.builder(this.clientCredentialRequest.parameters.scopes())
2828
.claims(this.clientCredentialRequest.parameters.claims())
29+
.tenant(this.clientCredentialRequest.parameters.tenant())
2930
.build();
3031

3132
RequestContext context = new RequestContext(

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AcquireTokenByOnBehalfOfSupplier.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ AuthenticationResult execute() throws Exception {
2626
SilentParameters parameters = SilentParameters
2727
.builder(this.onBehalfOfRequest.parameters.scopes())
2828
.claims(this.onBehalfOfRequest.parameters.claims())
29+
.tenant(this.onBehalfOfRequest.parameters.tenant())
2930
.build();
3031

3132
RequestContext context = new RequestContext(

0 commit comments

Comments
 (0)