Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -733,10 +733,18 @@ public static Response browserLogout(KeycloakSession session,
String brokerId = userSession.getNote(Details.IDENTITY_PROVIDER);
String initiatingIdp = logoutAuthSession.getAuthNote(AuthenticationManager.LOGOUT_INITIATING_IDP);
if (brokerId != null && !brokerId.equals(initiatingIdp)) {
UserAuthenticationIdentityProvider<?> identityProvider = IdentityBrokerService.getIdentityProvider(session, brokerId);
Response response = identityProvider.keycloakInitiatedBrowserLogout(session, userSession, uriInfo, realm);
if (response != null) {
return response;
UserAuthenticationIdentityProvider<?> identityProvider = null;
try {
identityProvider = IdentityBrokerService.getIdentityProvider(session, brokerId);
} catch (IdentityBrokerException e) {
logger.warnf("Identity provider [%s] is no longer available, skipping Keycloak-initiated broker logout for user session [%s]", brokerId, userSession.getId());
}

if (identityProvider != null) {
Response response = identityProvider.keycloakInitiatedBrowserLogout(session, userSession, uriInfo, realm);
if (response != null) {
return response;
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,4 +289,70 @@ public void testFrontChannelLogoutRequestsSendingOnlyClientIdWithFrontChannelLog
identityProviderResource.update(representation);
}
}

@Test
public void logoutSucceedsWhenIdpIsDisabled() {
Comment on lines +293 to +294
logInAsUserInIDPForFirstTime();
Assertions.assertTrue(oauth.parseLoginResponse().isSuccess());

// Disable the identity provider while the user session is still active
RealmResource consumerRealm = adminClient.realm(bc.consumerRealmName());
IdentityProviderResource idpResource = consumerRealm.identityProviders().get(bc.getIDPAlias());
IdentityProviderRepresentation idpRep = idpResource.toRepresentation();
idpRep.setEnabled(false);
idpResource.update(idpRep);

try {
// Browser logout should complete gracefully even though the IdP is disabled
logoutFromRealm(
getConsumerRoot(),
bc.consumerRealmName(),
null,
null,
null,
null
);

// Verify user is actually logged out
oauth.client("broker-app");
oauth.realm(bc.consumerRealmName());
oauth.openLoginForm();
waitForPage(driver, "sign in to", true);
} finally {
idpRep.setEnabled(true);
idpResource.update(idpRep);
}
}

@Test
public void logoutSucceedsWhenIdpIsRemoved() {
logInAsUserInIDPForFirstTime();
Assertions.assertTrue(oauth.parseLoginResponse().isSuccess());

// Remove the identity provider entirely while the user session is still active
RealmResource consumerRealm = adminClient.realm(bc.consumerRealmName());
IdentityProviderResource idpResource = consumerRealm.identityProviders().get(bc.getIDPAlias());
IdentityProviderRepresentation idpRep = idpResource.toRepresentation();
idpResource.remove();

try {
// Browser logout should complete gracefully even though the IdP no longer exists
logoutFromRealm(
getConsumerRoot(),
bc.consumerRealmName(),
null,
null,
null,
null
);

// Verify user is actually logged out
oauth.client("broker-app");
oauth.realm(bc.consumerRealmName());
oauth.openLoginForm();
waitForPage(driver, "sign in to", true);
} finally {
consumerRealm.identityProviders().create(idpRep).close();
}
}
}