Skip to content

Commit 3497943

Browse files
committed
Add IdP configuration to disable forwarding of the acr_values parameter
Closes keycloak#39813 Signed-off-by: Johannes Knutsen <johannes@kodet.no>
1 parent 114afee commit 3497943

File tree

5 files changed

+48
-5
lines changed

5 files changed

+48
-5
lines changed

js/apps/admin-ui/maven-resources/theme/keycloak.v2/admin/messages/messages_en.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,8 @@ byConfiguration=By configuration
14501450
usersAdded_other={{count}} users added to the group
14511451
userFedUnlinkUsersConfirmTitle=Unlink all users?
14521452
passCurrentLocale=Pass current locale
1453+
passAcrValues=Pass acr_values
1454+
passAcrValuesHelp=Pass the current acr_values query parameter on to the identity provider.
14531455
realmNameField=Realm name
14541456
roleCreated=Role created
14551457
socialProfileJSONFieldPath=Social Profile JSON Field Path

js/apps/admin-ui/src/identity-providers/add/ExtendedNonDiscoverySettings.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const ExtendedNonDiscoverySettings = () => {
4242
<SwitchField label="passLoginHint" field="config.loginHint" />
4343
<SwitchField label="passMaxAge" field="config.passMaxAge" />
4444
<SwitchField label="passCurrentLocale" field="config.uiLocales" />
45+
<SwitchField label="passAcrValues" field="config.forwardAcrValues" />
4546
<SwitchField
4647
field="config.backchannelSupported"
4748
label="backchannelLogout"

services/src/main/java/org/keycloak/broker/oidc/AbstractOAuth2IdentityProvider.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -359,9 +359,11 @@ protected UriBuilder createAuthorizationUrl(AuthenticationRequest request) {
359359
uriBuilder.queryParam(OAuth2Constants.PROMPT, prompt);
360360
}
361361

362-
String acr = request.getAuthenticationSession().getClientNote(OAuth2Constants.ACR_VALUES);
363-
if (acr != null) {
364-
uriBuilder.queryParam(OAuth2Constants.ACR_VALUES, acr);
362+
if (getConfig().isForwardAcrValues()) {
363+
String acr = request.getAuthenticationSession().getClientNote(OAuth2Constants.ACR_VALUES);
364+
if (acr != null) {
365+
uriBuilder.queryParam(OAuth2Constants.ACR_VALUES, acr);
366+
}
365367
}
366368
String forwardParameterConfig = getConfig().getForwardParameters() != null ? getConfig().getForwardParameters(): "";
367369
List<String> forwardParameters = Arrays.asList(forwardParameterConfig.split("\\s*,\\s*"));

services/src/main/java/org/keycloak/broker/oidc/OAuth2IdentityProviderConfig.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class OAuth2IdentityProviderConfig extends IdentityProviderModel {
3636
public static final String PKCE_METHOD = "pkceMethod";
3737
public static final String TOKEN_ENDPOINT_URL = "tokenUrl";
3838
public static final String TOKEN_INTROSPECTION_URL = "tokenIntrospectionUrl";
39+
public static final String FORWARD_ACR_VALUES = "forwardAcrValues";
3940

4041
public static final String JWT_X509_HEADERS_ENABLED = "jwtX509HeadersEnabled";
4142

@@ -143,6 +144,14 @@ public void setForwardParameters(String forwardParameters) {
143144
getConfig().put("forwardParameters", forwardParameters);
144145
}
145146

147+
public boolean isForwardAcrValues() {
148+
return Boolean.parseBoolean(getConfig().getOrDefault(FORWARD_ACR_VALUES, "false"));
149+
}
150+
151+
public void setForwardAcrValues(boolean forwardAcrValues) {
152+
getConfig().put(FORWARD_ACR_VALUES, String.valueOf(forwardAcrValues));
153+
}
154+
146155
public boolean isPkceEnabled() {
147156
return Boolean.parseBoolean(getConfig().getOrDefault(PKCE_ENABLED, "false"));
148157
}

testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/KcOidcBrokerAcrParameterTest.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package org.keycloak.testsuite.broker;
22

3+
import org.junit.Test;
4+
import org.keycloak.admin.client.resource.IdentityProviderResource;
35
import org.keycloak.admin.client.resource.UsersResource;
6+
import org.keycloak.representations.idm.IdentityProviderRepresentation;
47
import org.keycloak.representations.idm.UserRepresentation;
58
import org.keycloak.testsuite.Assert;
69

@@ -18,8 +21,29 @@ protected BrokerConfiguration getBrokerConfiguration() {
1821
return KcOidcBrokerConfiguration.INSTANCE;
1922
}
2023

24+
@Test
25+
public void testLogInAsUserInIDPWithAcrValues() {
26+
// Forward acr_values = true
27+
IdentityProviderResource idpRes = adminClient
28+
.realm(bc.consumerRealmName())
29+
.identityProviders()
30+
.get(BrokerTestConstants.IDP_OIDC_ALIAS);
31+
IdentityProviderRepresentation idpRep = idpRes.toRepresentation();
32+
OIDCIdentityProviderConfigRep cfg = new OIDCIdentityProviderConfigRep(idpRep);
33+
cfg.setForwardAcrValues(true);
34+
idpRes.update(idpRep);
35+
36+
assertValidLogin(true);
37+
38+
testSingleLogout();
39+
}
40+
2141
@Override
2242
protected void loginUser() {
43+
assertValidLogin(false);
44+
}
45+
46+
private void assertValidLogin(boolean expectHasAcrValues) {
2347
oauth.clientId("broker-app");
2448
loginPage.open(bc.consumerRealmName());
2549

@@ -33,8 +57,13 @@ protected void loginUser() {
3357
Assert.assertTrue("Driver should be on the provider realm page right now",
3458
driver.getCurrentUrl().contains("/auth/realms/" + bc.providerRealmName() + "/"));
3559

36-
Assert.assertTrue(ACR_VALUES + "=" + ACR_3 + " should be part of the url",
37-
driver.getCurrentUrl().contains(ACR_VALUES + "=" + ACR_3));
60+
if (expectHasAcrValues) {
61+
Assert.assertTrue(ACR_VALUES + "=" + ACR_3 + " SHOULD be part of the url",
62+
driver.getCurrentUrl().contains(ACR_VALUES + "=" + ACR_3));
63+
} else {
64+
Assert.assertFalse(ACR_VALUES + "=" + ACR_3 + " SHOULD NOT be part of the url",
65+
driver.getCurrentUrl().contains(ACR_VALUES + "=" + ACR_3));
66+
}
3867

3968
log.debug("Logging in");
4069
loginPage.login(bc.getUserLogin(), bc.getUserPassword());

0 commit comments

Comments
 (0)