@@ -644,16 +644,22 @@ def sp_logout_request
644644 delete_session
645645 else
646646
647- # Since we created a new SAML request, save the transaction_id
648- # to compare it with the response we get back
649647 logout_request = OneLogin::RubySaml::Logoutrequest.new ()
650- session[:transaction_id] = logout_request.uuid
651- logger.info " New SP SLO for userid '#{session[:userid]}' transactionid '#{session[:transaction_id]}'"
648+ logger.info " New SP SLO for userid '#{session[:userid]}' transactionid '#{logout_request.uuid}'"
652649
653650 if settings.name_identifier_value.nil?
654651 settings.name_identifier_value = session[:userid]
655652 end
656653
654+ # Ensure user is logged out before redirect to IdP, in case anything goes wrong during single logout process (as recommended by saml2int [SDP-SP34])
655+ logged_user = session[:userid]
656+ logger.info " Delete session for '#{session[:userid]}'"
657+ delete_session
658+
659+ # Save the transaction_id to compare it with the response we get back
660+ session[:transaction_id] = logout_request.uuid
661+ session[:logged_out_user] = logged_user
662+
657663 relayState = url_for controller: ' saml' , action: ' index'
658664 redirect_to(logout_request.create(settings, :RelayState => relayState))
659665 end
@@ -681,7 +687,7 @@ def process_logout_response
681687 logger.error " The SAML Logout Response is invalid"
682688 else
683689 # Actually log out this session
684- logger.info " Delete session for '#{session[:userid ]}'"
690+ logger.info " SLO completed for '#{session[:logged_out_user ]}'"
685691 delete_session
686692 end
687693end
690696def delete_session
691697 session[:userid] = nil
692698 session[:attributes] = nil
699+ session[:transaction_id] = nil
700+ session[:logged_out_user] = nil
693701end
694702` ` `
695703
0 commit comments