[KEYCLOAK-5770] - Global Saml Logout doesn't create logout event
This commit is contained in:
parent
6d91ab674b
commit
e3c9fa25a3
2 changed files with 27 additions and 8 deletions
|
@ -29,7 +29,9 @@ import org.keycloak.connections.httpclient.HttpClientProvider;
|
|||
import org.keycloak.dom.saml.v2.assertion.AssertionType;
|
||||
import org.keycloak.dom.saml.v2.assertion.AttributeStatementType;
|
||||
import org.keycloak.dom.saml.v2.protocol.ResponseType;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.models.AuthenticatedClientSessionModel;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.KeyManager;
|
||||
|
@ -40,7 +42,6 @@ import org.keycloak.models.UserModel;
|
|||
import org.keycloak.models.UserSessionModel;
|
||||
import org.keycloak.protocol.LoginProtocol;
|
||||
import org.keycloak.protocol.ProtocolMapper;
|
||||
import org.keycloak.protocol.RestartLoginCookie;
|
||||
import org.keycloak.protocol.saml.mappers.SAMLAttributeStatementMapper;
|
||||
import org.keycloak.protocol.saml.mappers.SAMLLoginResponseMapper;
|
||||
import org.keycloak.protocol.saml.mappers.SAMLRoleListMapper;
|
||||
|
@ -597,16 +598,25 @@ public class SamlProtocol implements LoginProtocol {
|
|||
builder.addExtension(new KeycloakKeySamlExtensionGenerator(keyName));
|
||||
}
|
||||
}
|
||||
|
||||
Response response;
|
||||
try {
|
||||
return buildLogoutResponse(userSession, logoutBindingUri, builder, binding);
|
||||
} catch (ConfigurationException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (ProcessingException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
response = buildLogoutResponse(userSession, logoutBindingUri, builder, binding);
|
||||
} catch (ConfigurationException | ProcessingException | IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
if (logoutBindingUri != null) {
|
||||
event.detail(Details.REDIRECT_URI, logoutBindingUri);
|
||||
}
|
||||
event.event(EventType.LOGOUT)
|
||||
.detail(Details.AUTH_METHOD, userSession.getAuthMethod())
|
||||
.client(session.getContext().getClient())
|
||||
.user(userSession.getUser())
|
||||
.session(userSession)
|
||||
.detail(Details.USERNAME, userSession.getLoginUsername())
|
||||
.detail(Details.RESPONSE_MODE, postBinding ? SamlProtocol.SAML_POST_BINDING : SamlProtocol.SAML_REDIRECT_BINDING)
|
||||
.detail(SamlProtocol.SAML_LOGOUT_REQUEST_ID, userSession.getNote(SAML_LOGOUT_REQUEST_ID))
|
||||
.success();
|
||||
return response;
|
||||
}
|
||||
|
||||
protected Response buildLogoutResponse(UserSessionModel userSession, String logoutBindingUri, SAML2LogoutResponseBuilder builder, JaxrsSAML2BindingBuilder binding) throws ConfigurationException, ProcessingException, IOException {
|
||||
|
|
|
@ -169,6 +169,15 @@ public class SamlService extends AuthorizationEndpointBase {
|
|||
event.error(Errors.INVALID_SAML_LOGOUT_RESPONSE);
|
||||
return ErrorPage.error(session, null, Response.Status.BAD_REQUEST, Messages.INVALID_REQUEST);
|
||||
}
|
||||
String issuer = statusResponse.getIssuer().getValue();
|
||||
ClientModel client = realm.getClientByClientId(issuer);
|
||||
if (client == null) {
|
||||
event.event(EventType.LOGOUT);
|
||||
event.client(issuer);
|
||||
event.error(Errors.CLIENT_NOT_FOUND);
|
||||
return ErrorPage.error(session, null, Response.Status.BAD_REQUEST, Messages.CLIENT_NOT_FOUND);
|
||||
}
|
||||
session.getContext().setClient(client);
|
||||
logger.debug("logout response");
|
||||
Response response = authManager.browserLogout(session, realm, userSession, uriInfo, clientConnection, headers);
|
||||
event.success();
|
||||
|
|
Loading…
Reference in a new issue