Support Article
SAML/SSO timeout-does-not-redirect-login-page
SA-51936
Summary
Implemented a solution recommended by a support article to have the user redirected to the login page upon timeout. However, it is un-authenticating the user, but not redirecting them to the login page.
Followed the directions per this support article:
https://pdn.pega.com/support-articles/saml-timeout-does-not-redirect-login-page
Error Messages
The content cannot be displayed in a frame.
Steps to Reproduce
1. Have Timeout setting is set as 60 seconds (example) in Access Group
2. Login to system by using the SSO URL
3. After 2 mins system the user is still in interaction portal
4a. It Is taking the user back to login only after hitting the refresh icon in the browser.
4b. If user clicks anywhere on the UI after being unauthenticated, an error displays.
Root Cause
The PDN support article is for handling timeouts and reauthentication and not showing the logoff timer.
Resolution
Client is using CRM and requires special JQuery version of sessiontimer so modal window closes and logoff occurs properly.
1) Copy pxSessionTimer to application ruleset and rename to SessionTimer<AppName>
2) Replace <script></script> block with the following
<script>
pega.d.TimeoutTime = '<%=pyTimeoutTime%>';
pega.d.TimeoutWarningWindow = '<%=pyTimeoutWarningWindow%>';
pega.d.TimeoutPopuptype = '<%=pyTimeoutPopupType%>';
pega.d.TimeoutPopupHeight = "<pega:lookup className="Rule-Obj-FieldValue" property="pyLocalizedValue"><pega:key name="pyClassName" value ="Rule-Portal" /><pega:key name="pyFieldName" value="pyTimeoutPopupType" /><pega:key name="pyFieldValue" value="WindowHeight" /></pega:lookup>";
pega.d.TimeoutPopupWidth = "<pega:lookup className="Rule-Obj-FieldValue" property="pyLocalizedValue"><pega:key name="pyClassName" value ="Rule-Portal" /><pega:key name="pyFieldName" value="pyTimeoutPopupType" /><pega:key name="pyFieldValue" value="WindowWidth" /></pega:lookup>";
pega.d.TimeoutWarning = '<%=warningMsg%>';
if (pega.d.TimeoutWarningCountdown != null) {
console.log("clearing timer [load]: " + pega.desktop.TimeoutWarningCountdown);
clearTimeout(pega.desktop.TimeoutWarningCountdown);
}
console.log("onload inline setting timer to null");
pega.d.TimeoutWarningCountdown = null;
currentTimerRandID = null;
function desktop_restartTimeoutWarningTimer(){
if (pega.desktop.TimeoutTime && pega.desktop.TimeoutTime > 0) {
var nTimeoutWarningTime= (pega.desktop.TimeoutTime - pega.desktop.TimeoutWarningWindow) * 60000;
console.log("clearing timer: " + pega.desktop.TimeoutWarningCountdown);
clearTimeout(pega.desktop.TimeoutWarningCountdown);
pega.desktop.TimeoutWarningCountdown = null;
if (nTimeoutWarningTime >= 0) {
currentTimerRandID = Math.floor(100000 + Math.random() * 9000000);
console.log("currentTimerRandID: "+ currentTimerRandID);
pega.d.TimeoutWarningCountdown = self.setTimeout("desktop_showTimeoutLogoffDialogNew('"+pega.d.TimeoutWarningWindow +"','"+currentTimerRandID+"')",nTimeoutWarningTime);
console.log("created timer: " + pega.desktop.TimeoutWarningCountdown);
}
}
}
/*@protected
* Shows user a warning when their session is about to timeout so they can have the option to
* extend their session. Logs the user off if they do not extend.
* @return $void$
*/
function desktop_showTimeoutLogoffDialogNew(strTime, timerID) {
if (timerID == currentTimerRandID){
var iTime = parseInt(strTime);
iTime = iTime * 60000;
var oSafeURL = new SafeURL("@baseclass.ShowLogoffTimer");
oSafeURL.put("time",iTime);
/*pega.openUrlInModal.showModalDialog*/
console.log("displaying logoff timer");
showJqueryModalDialog(oSafeURL,iTime, 210, 420, function(ret){
if (ret == null || ret == "ok") {
console.log("calling desktop_restartTimeoutWarningTimer from OK response from modal");
desktop_restartTimeoutWarningTimer();
} else {
pega.u.d.gDirtyOverride = false;
try {
application.logOff(true);
} catch(e) {
pega.u.d.replace('pyActivity=LogOff&pzPrimaryPageName=pyDisplayHarness', null);
}
}
});
/* This is not needed, was put in for testing lower timeout values
self.setTimeout(function(){console.log("clearing timer while modal displays");clearTimeout(pega.desktop.TimeoutWarningCountdown);}, 5000);
*/
}
else{
console.log("timerID: "+ timerID + " did not match currentTimerRandID: "+ currentTimerRandID);
}
}
/* display a modal dialog using jquery */
function showJqueryModalDialog(url, arDialogArguments, height, width, callbackFunction ) {
if(arDialogArguments) window.dialogArguments = arDialogArguments;
var $frame = $('<div><iframe name="pzDisplayModalDialog" id="pzDisplayModalDialog" frameborder="0" src="https://community.pega.com/%27%20%2B%20%28%20typeof%20url%20%3D%3D%20"string" ? url : url.toURL() ) + '" style="width:100%; height:100%"/></div>');
var $dialogWindow = $frame.dialog({
autoOpen: true,
modal: true,
width: width,
height: height+50,
resizable: false,
autoResize: false,
overlay: {
opacity: 0.8,
background: "black"
},
open: function() {
pzDisplayModalDialogWindow = $(this).children()[0].contentWindow;
if(window.gsServerReqURI) pzDisplayModalDialogWindow.gsServerReqURI = window.gsServerReqURI;
pzDisplayModalDialogWindow.dialogArguments = window.dialogArguments;
pzDisplayModalDialogWindow.returnValue = undefined;
},
close: function() {
handleCloseJqueryModal( callbackFunction, undefined , $frame, $dialogWindow);
}
}).width(width-30).height(height).css("overflow", "hidden");
// PRPC 7.3.1 and later:
//$frame.children().on("load", function() {
//Prior to PRPC 7.3.1
$frame.children().load(function() {
var title = $(this).contents().find("title").html();
$dialogWindow.dialog('option', 'title', title);
pzDisplayModalDialogWindow = $(this)[0].contentWindow;
pzDisplayModalDialogWindow.closeModal = function() {
handleCloseJqueryModal( callbackFunction, pzDisplayModalDialogWindow.returnValue, $frame, $dialogWindow );
};
});
}
function handleCloseJqueryModal( callbackFunction, retval, frame, dialogWindow ) {
window.returnValue = retval;
dialogWindow.dialog('destroy');
frame.remove();
dialogWindow.remove();
if( callbackFunction) {
try {
callbackFunction(window.returnValue);
} catch(e) {
alert("pega.openUrlInModal.showModalDialog - error when calling callbackfunction: '" +e.message + "'");
}
}
}
</script>
Published February 13, 2018 - Updated October 8, 2020
Have a question? Get answers now.
Visit the Collaboration Center to ask questions, engage in discussions, share ideas, and help others.