<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>question Re: Where is the Single Sign-On script located? in Developer forum</title>
    <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142062#M798988</link>
    <description>&lt;P&gt;Go under the script includes, then search for SSO or what have you. &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;You can create an application menu so that you don't have to go searching for them again. &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="find_real_file.png"&gt;&lt;img src="https://www.servicenow.com/community/image/serverpage/image-id/76383iE4A18108EA5E3988/image-size/large?v=v2&amp;amp;px=999" role="button" title="find_real_file.png" alt="find_real_file.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;BR /&gt;</description>
    <pubDate>Wed, 07 Dec 2016 21:06:33 GMT</pubDate>
    <dc:creator>Blaze2</dc:creator>
    <dc:date>2016-12-07T21:06:33Z</dc:date>
    <item>
      <title>Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142059#M798985</link>
      <description>&lt;P&gt;@Where is the Single Sign-On script located that uses the Customization Properties for Single Sign-on form?&lt;/P&gt;&lt;P&gt;This form has input fields for HTTP Header Name and ServiceNow field name to match against the incoming header.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am aware of the External Authentication script located in the group of Installation Exist list of scripts. However the Single Sign-On doesn't seem to use the External Authentication script in the Installation Exist list of scripts.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am assuming the Single Sign-On customization script exist somewhere within a Service Now table.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks in advance for your assistance.&lt;/P&gt;</description>
      <pubDate>Wed, 07 Dec 2016 17:52:27 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142059#M798985</guid>
      <dc:creator>xmikeam</dc:creator>
      <dc:date>2016-12-07T17:52:27Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142060#M798986</link>
      <description>&lt;P&gt;Under System Definition --&amp;gt; Installation Exits.&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 07 Dec 2016 17:55:04 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142060#M798986</guid>
      <dc:creator>sudharsanv36</dc:creator>
      <dc:date>2016-12-07T17:55:04Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142061#M798987</link>
      <description>&lt;P&gt;Thanks for feedback Sudharsan. However, as mentioned in my question, I am aware of these scripts in the Installation Exist group. These scripts are not used in the SSO customization properties configuration form.&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;I've tested disabling External Authentication and enabling within the SSO form "Enable external authentication" and providing a HTTP header name and ServiceNow field name and it works.&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;What I am attempting to do is parse the HTTP header value but I cannot seem to locate where the Single Sign-on script is located.&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 07 Dec 2016 19:02:53 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142061#M798987</guid>
      <dc:creator>xmikeam</dc:creator>
      <dc:date>2016-12-07T19:02:53Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142062#M798988</link>
      <description>&lt;P&gt;Go under the script includes, then search for SSO or what have you. &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;You can create an application menu so that you don't have to go searching for them again. &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="find_real_file.png"&gt;&lt;img src="https://www.servicenow.com/community/image/serverpage/image-id/76383iE4A18108EA5E3988/image-size/large?v=v2&amp;amp;px=999" role="button" title="find_real_file.png" alt="find_real_file.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 07 Dec 2016 21:06:33 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142062#M798988</guid>
      <dc:creator>Blaze2</dc:creator>
      <dc:date>2016-12-07T21:06:33Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142063#M798989</link>
      <description>&lt;P&gt;Thanks Blaze. What version of Service Now are using. I forgot to mention I am using the Geneva version. I tried to locate those scripts on my version and didn't come up with anything.&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 07 Dec 2016 21:45:24 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142063#M798989</guid>
      <dc:creator>xmikeam</dc:creator>
      <dc:date>2016-12-07T21:45:24Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142064#M798990</link>
      <description>&lt;P&gt;I am in helsinki&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;I was trying to send you the xml file with the scripts in them I will make 4 separate replies with a screenshot of the script and then the text version. &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="find_real_file.png"&gt;&lt;img src="https://www.servicenow.com/community/image/serverpage/image-id/76381i8A62DEF5BD79B810/image-size/large?v=v2&amp;amp;px=999" role="button" title="find_real_file.png" alt="find_real_file.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;var MultiSSO_Abstract_Core = Class.create();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;MultiSSO_Abstract_Core.prototype = {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; debugMode: false,&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; failedRedirect : "",&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; failedSSO: "",&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; logoutRedirect: "",&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ssoHelper: null,&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; LOG_SOURCE : 'MultiSSO',&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; LOGGER : GlideSysLog,&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; initialize : function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (gs.getProperty("glide.authenticate.multisso.debug") == "true"){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.debugMode = true;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.debugMode = false;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; getHeaderOrCookie : function(sentHeader){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //this.debug("Fetching header: " + sentHeader);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Look in the Headers&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var data = request.getHeader(sentHeader);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // If not, then check the URL Parameters&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!data) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data = request.getParameter(sentHeader);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // then maybe its a cookie&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!data) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var CookieMan = GlideCookieMan;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var cookies = request.getCookies();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data = CookieMan.getCookieValue(cookies, sentHeader);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return data;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; printDebugValues : function(){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (this.debugMode){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var headerNames = request.getHeaderNames();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (headerNames.hasMoreElements()){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var aName = headerNames.nextElement();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.debug("HEADER: " + aName + " --&amp;gt; " + request.getHeader(aName));&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var parmMap = request.getParameterMap();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.printHashTable(parmMap);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; printHashTable : function( hashMap ){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var iterator = hashMap.keySet().iterator();// Iterate on keys&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.debug("Printing POST Parms...");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while ( iterator.hasNext() ){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var key = iterator.next();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var value = hashMap.get( key );&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(var i=0; i&amp;lt;value.length; i++){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.debug( "POST Parm '" + key + "': " + value[i] );&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; debug : function (msg){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (this.debugMode){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.LOGGER.info(this.LOG_SOURCE, msg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; error: function (msg){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.LOGGER.info(this.LOG_SOURCE, "ERROR: " + msg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var lMsg = gs.getMessage(msg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gs.addErrorMessage(lMsg );&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; //GETTERS&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; getIDPRedirect : function (){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var idp_url = (this.propertiesGR.failed_requirement_redirect) ? this.propertiesGR.failed_requirement_redirect: &amp;nbsp; this.propertiesGR.idp_authnrequest_url;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return idp_url;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; getFailedSSORedirect : function (){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var failure_url = (this.propertiesGR.failed_redirect) ? this.propertiesGR.failed_redirect: "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return failure_url ;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; getLogoutRedirect : function (){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var logout_url = (this.propertiesGR.external_logout_redirect) ? this.propertiesGR.external_logout_redirect: this.propertiesGR.idl_logout_url;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return logout_url;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; getSecretKey : function (data){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var cred = new String(data);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var e = new GlideEncrypter();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var jsCred = cred + '';&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var decryptedData = e.decrypt(jsCred);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return decryptedData ;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; //SETTERS&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; setSSOHelper : function (helper){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.ssoHelper = helper;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; this.propertiesGR = this.ssoHelper.getProperties();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;};&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 07 Dec 2016 23:10:39 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142064#M798990</guid>
      <dc:creator>Blaze2</dc:creator>
      <dc:date>2016-12-07T23:10:39Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142065#M798991</link>
      <description>&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="find_real_file.png"&gt;&lt;img src="https://www.servicenow.com/community/image/serverpage/image-id/76385iE048635FC369668C/image-size/large?v=v2&amp;amp;px=999" role="button" title="find_real_file.png" alt="find_real_file.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;gs.include("SSO_Helper");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;gs.include("SSO_SAMLMetaUtil");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;var MultiSSO_ClientHelper = Class.create();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;// method name cannot start with "get"!&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;MultiSSO_ClientHelper.prototype = Object.extendsObject(AbstractAjaxProcessor , {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; isPublic: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return true;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; getDiscoveryURL: function(serviceURL, federationId) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var pat = /^https?:\/\//i;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (pat.test(serviceURL)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // we always use it for sp entity id which is globally unique name&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var instanceURL = new SSO_SAMLMetaUtil().getInstanceURL();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var returnURL = GlideStringUtil.urlEncode(instanceURL + "/login_with_sso.do");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return serviceURL + "?entityID=" + GlideStringUtil.urlEncode(instanceURL) + "&amp;amp;return=" + returnURL;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return serviceURL + "?glide_federation_id=" + federationId;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // return auto prov idp id or select URL&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; autoProvIdPOrSelectURL: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ("true" == gs.getProperty("glide.authenticate.multisso.user.autoprovision")) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var atp = SNC.SSOUtils.getAutoProvSAMLIdPList();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var count = atp.getRowCount();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (count&amp;gt;1) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var url = "/idp_disco.do";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Returning auto provisioning discovery URL: " + url);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result.setAttribute("discovery_service_url", url);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return url;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // only one auto prov idp found just login with this idp&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; atp.next();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (count == 1) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var idpId = atp.getUniqueValue();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Returning auto provisioning IdP: " + idpId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result.setAttribute(SNC.SSOUtils.SSOID(), idpId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return idpId;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return null;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ssoByUser: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userId = this.getParameter("sysparm_user_id");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var user_field = gs.getProperty("glide.authenticate.multisso.login_locate.user_field", "user_name");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Looking up user id : " + userId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userTab = new GlideRecord("sys_user");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; userTab.addQuery(user_field, userId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; userTab.addActiveQuery();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; userTab.queryNoDomain();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var found = false;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if(userTab.next()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var source = userTab.sso_source;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (GlideStringUtil.notNil(source)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Found SSO " + source + " for the user : " + userId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var values = source.split(":");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if ( values.length &amp;gt; 1 ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if ("sso" == values[0] ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Returing SSO IdP from user record: " + values[1]);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var ssoBase = new GlideRecord("sso_properties");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ssoBase.addActiveQuery();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ssoBase.addQuery("sys_id", values[1]);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ssoBase.queryNoDomain();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (ssoBase.next()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute(SNC.SSOUtils.SSOID(), values[1]);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = true;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("SSO Provider not found or inActive at user record: " + values[1]);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = false;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else if ( "federation" == values[0] ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var federationId = values[1];&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Returing SSO federation from user record: " + federationId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var fed = new GlideRecord("sso_federation");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; fed.addActiveQuery();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; fed.addQuery("sys_id", federationId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; fed.queryNoDomain();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (fed.next()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = true;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var url = this.getDiscoveryURL(fed.discovery_service_url, federationId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Discovery URL: " + url);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute("discovery_service_url", url);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = false;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Federation not found or inActive at user record: " + federationId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if(!found) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // try user company&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var company = userTab.company;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (company &amp;amp;&amp;amp; !company.isNil()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // get the source field from referenced company record.&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var source = company.getRefRecord().sso_source;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (GlideStringUtil.notNil(source)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Found SSO " + source + " for the user : " + userId + " from its company record");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var values = source.split(":");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if ( values.length &amp;gt; 1 ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if ( "sso" == values[0] ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Returing SSO IdP from company record: " + values[1]);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var ssoBase = new GlideRecord("sso_properties");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ssoBase.addActiveQuery();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ssoBase.addQuery("sys_id", values[1]);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ssoBase.queryNoDomain();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (ssoBase.next()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute(SNC.SSOUtils.SSOID(), values[1]);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = true;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("SSO Provider not found or inActive at company record: " + values[1]);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = false;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else if ( "federation" == values[0] ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var federationId = values[1];&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Returing SSO federation from company record: " + federationId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var fed = new GlideRecord("sso_federation");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; fed.addActiveQuery();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; fed.addQuery("sys_id", federationId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; fed.queryNoDomain();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (fed.next()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = true;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var url = this.getDiscoveryURL(fed.discovery_service_url, federationId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Discovery URL: " + url);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute("discovery_service_url", url);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = false;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Federation not found or inActive at company record: " + federationId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // user not found, check if we need auto provisioning&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var autoProvOrURL = this.autoProvIdPOrSelectURL();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (GlideStringUtil.notNil(autoProvOrURL)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = true;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (!found) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // no sso found, try to use the default one&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var defaultProvider = SSO_Helper.getDefaultSSOProperties();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (defaultProvider) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; found = true;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var defaultSysId = defaultProvider.sys_id;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SSO_Helper.debug("Using default SSO: " + defaultSysId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute(SNC.SSOUtils.SSOID(), defaultSysId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (!found)&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.setError(gs.getMessage("External login not found"));&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; loadSAMLMetaFromXML: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var meta_xml = this.getParameter("sysparm_meta_xml");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var sys_id = this.getParameter("sysparm_sys_id");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var resultArray = new SSO_SAMLMetaUtil().loadSAMLMetaFromXML(meta_xml, sys_id);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if(resultArray.sys_id != null)&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute("sys_id", resultArray.sys_id);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute("error_msg", resultArray.error_msg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; loadSAMLMetaFromURL: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var meta_url = this.getParameter("sysparm_meta_url");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var sys_id = this.getParameter("sysparm_sys_id");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var resultArray = new SSO_SAMLMetaUtil().loadSAMLMetaFromURL(meta_url, sys_id);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var result = this.newItem("result");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if(resultArray.sys_id != null)&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute("sys_id", resultArray.sys_id);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; result.setAttribute("error_msg", resultArray.error_msg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; type: 'MultiSSO_ClientHelper'&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;});&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 07 Dec 2016 23:11:17 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142065#M798991</guid>
      <dc:creator>Blaze2</dc:creator>
      <dc:date>2016-12-07T23:11:17Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142066#M798992</link>
      <description>&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="find_real_file.png"&gt;&lt;img src="https://www.servicenow.com/community/image/serverpage/image-id/76387iC17399D017451A15/image-size/large?v=v2&amp;amp;px=999" role="button" title="find_real_file.png" alt="find_real_file.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;gs.include("PrototypeServer");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;var MultiSSO_DigestedToken = Class.create();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;MultiSSO_DigestedToken.prototype = Object.extend(new MultiSSO_Abstract_Core(), {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; process : function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userData = SSO_Helper.getHeaderOrCookie(this.propertiesGR.header_key);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userDigest = SSO_Helper.getHeaderOrCookie(this.propertiesGR.encrypted_key);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userField = this.propertiesGR.user_field;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var secretKey = this.getSecretKey(this.propertiesGR.secret_key);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.debug("User Data: " + userData);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.debug("User Digest Received: " + userDigest);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.debug("User Field: " + userField);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // if found run encryption&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (userData &amp;amp;&amp;amp; userDigest) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; try {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // Replace all spaces with plus(+)'s, converted in url&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; userDigest = userDigest.replaceAll(' ', '+');&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // Ecrypt the username and secretKey combination to calculate digest&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userDigestCalc = this.getDigest(userData, secretKey);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.debug ("User Digest Received: " + userDigest + " Calculated: " + userDigestCalc );&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // Check for match if recieved digest data matches calculated digest&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (userDigest == userDigestCalc) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.debug("Digest value received matches with calculated");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var ugr = new GlideRecord("sys_user");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ugr.initialize();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (!ugr.isValidField(userField)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var Log = GlideLog;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; Log.warn("External authorization is set to use field: '" + userField + "' which doesn't exist");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; gs.log("External authorization is set to use field: '" + userField + "' which doesn't exist");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendDigestLoginFailureEventData("user_name=" + userData + ",multisso=true,idpsysid=" + this.propertiesGR.getUniqueValue());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return this.getFailedRedirect();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ugr.addQuery(userField, userData);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ugr.query();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (!ugr.next()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var User = GlideUser;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userLoad = User.getUser(userData);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (userLoad == null){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; gs.log("User authenticated...but we cannot find this user in Service-now");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendDigestLoginFailureEventData("user_name=" + userData + ",multisso=true,idpsysid=" + this.propertiesGR.getUniqueValue());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return this.getFailedRedirect();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ugr.initialize();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ugr.addQuery(userField, userData);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ugr.query();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (!ugr.next()){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; gs.log("User authenticated...but we cannot find this user in Service-now 2");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendDigestLoginFailureEventData("user_name=" + userData + ",multisso=true,idpsysid=" + this.propertiesGR.getUniqueValue());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return this.getFailedRedirect();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.debug("Success. Logging in user: " + userData);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; request.getSession().setAttribute("glide.multiSSO.logout_url", this.propertiesGR.external_logout_redirect.toString());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // userDataValidated could be any of email, user_name or others&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userDataValidated = ugr.getValue(userField);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendDigestLoginSuccessEventData("user_name=" + userData, "multisso=true,idpsysid=" + this.propertiesGR.getUniqueValue());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return userDataValidated;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; gs.log("User Digest Received did not match Calculated Digest");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendDigestLoginFailureEventData("user_name=" + userData, "multisso=true,idpsysid=" + this.propertiesGR.getUniqueValue());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return this.getFailedRedirect();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } catch(e) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; gs.log(e);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendDigestLoginFailureEventData("user_name=" + userData, "multisso=true,idpsysid=" + this.propertiesGR.getUniqueValue());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return this.getFailedRedirect();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // Encoded data didn't match recieved Encoded data&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // If there is no userData and userDigest together then redirect him to another portal.&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // Example: Customer's Intranet site where user's Digest Token Authentication URL could already be present.&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return this.getPortalURLRedirect();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; getDigest : function( data, secretKey ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; try {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // default to something JDK 1.4 has&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var MAC_ALG = "HmacSHA1";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return &amp;nbsp; SncAuthentication.encode(data, secretKey, MAC_ALG);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; } catch (e) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; throw 'failed_missing_requirement';&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; getFailedRedirect : function (){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var failure_url = (this.propertiesGR.failed_redirect) ? this.propertiesGR.failed_redirect.toString(): "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return failure_url;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; getPortalURLRedirect : function () {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var portalURL = (this.propertiesGR.portal_url_redirect) ? this.propertiesGR.portal_url_redirect.toString() : "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return portalURL;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;});&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 07 Dec 2016 23:12:01 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142066#M798992</guid>
      <dc:creator>Blaze2</dc:creator>
      <dc:date>2016-12-07T23:12:01Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142067#M798993</link>
      <description>&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="find_real_file.png"&gt;&lt;img src="https://www.servicenow.com/community/image/serverpage/image-id/76384i96345E291C4C5AC4/image-size/large?v=v2&amp;amp;px=999" role="button" title="find_real_file.png" alt="find_real_file.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;gs.include("PrototypeServer");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;gs.include("SAML2_update1");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;gs.include("SSO_Helper");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;gs.include("MultiSSO_SAML2_UserProvisioning");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;var MultiSSO_SAML2_Update1 = Class.create();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;MultiSSO_SAML2_Update1.prototype = Object.extend(new MultiSSO_Abstract_Core(), {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; initialize: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; process: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.redirectURL = null;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.requestType = "request";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var result = this.processSAMLMessage(); &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return result;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } finally {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.setActionRedirectURL();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; processSAMLMessage: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var Session = GlideUISession;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var relayState = request.getParameter("RelayState");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.SAML2 = new SAML2_update1(this.ssoHelper);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logoutURL = (this.propertiesGR.idp_logout_url) ? this.propertiesGR.idp_logout_url : this.propertiesGR.external_logout_redirect;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.serviceURL = this.propertiesGR.service_url;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.userField = this.propertiesGR.user_field;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var samlResponseObject = null;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(GlideController.exists("SAMLResponseObject"))&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; samlResponseObject = GlideController.getGlobal("SAMLResponseObject");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logDebug("SAMLResponseObject not found in GlideController.");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; samlResponseObject = this.SAML2.getSAMLObjectFromRequest(request);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Refresh login request&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!samlResponseObject &amp;amp;&amp;amp; !relayState) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var redirectURL = this.SAML2.generateAuthnRequestRedirectURL(request, false);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (GlideStringUtil.nil(redirectURL))&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "failed_missing_requirement";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLRedirectSentEventData("", "multisso=true,idpsysid=" + this.propertiesGR.getUniqueValue());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return redirectURL;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var httpSession = request.getSession();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var inResponseTo = httpSession.getAttribute("glide.saml2.session_request_id");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SSO_Helper.debug("Session inResponseTo: " + inResponseTo);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (this.SAML2.isLogoutResponse(samlResponseObject)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logDebug("It is a logout response");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.requestType = "logoutResponse";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!this.SAML2.validateLogoutResponseObject(samlResponseObject, inResponseTo)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError("Could not validate SAML LogoutResponse");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gs.eventQueue(this.SAML2.logoutFailureEventId, null, Session.getId(httpSession), "SAML2 LogoutResponse validation failed.");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "logout_success";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // If none of above, this is login response from IDP.&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return this.loginProcess(samlResponseObject, inResponseTo);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; isIdPInitiated: function(inResponseTo) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // for IdP initiated SAML response, inResponseTo is empty&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; return GlideStringUtil.nil(inResponseTo);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; loginProcess : function(samlResponseObject, inResponseTo) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var respType = this.isIdPInitiated(inResponseTo) ? "IdP" : "SP";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var eventLogParm2 = "initiator=" + respType + ",multisso=true,idpsysid=" + this.propertiesGR.getUniqueValue();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; SNC.SecurityEventSender.sendSAMLRedirectReceivedEventData("", eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!this.SAML2.validateLoginResponse(samlResponseObject, inResponseTo)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError("Could not validate SAMLResponse");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData("", eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var nameId = null;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ( this.propertiesGR.nameid_attribute &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;&amp;amp; !this.propertiesGR.nameid_attribute.isNil() ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logDebug("Use nameid_attribute to look up NameID.");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nameId = this.SAML2.getAssertionAttrValueByNameOrFriendlyName(this.propertiesGR.nameid_attribute);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nameId = this.SAML2.getSubjectNameID();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (nameId == null) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SSOUtils.writeMultipleLogSummary(false, gs.getMessage("Subject NameID validation failed"), gs.getMessage("Could not extract Subject NameID from SAMLResponse"), 'subject');&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError("Could not extract Subject NameID from SAMLResponse");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData("", eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return this.propertiesGR.getValue("failed_requirement_redirect");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logDebug("SAML2 NameID: " + nameId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var eventLogParm1 = "user_name=" + nameId; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var sessionIndex = this.SAML2.getSessionIndex();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (sessionIndex == null) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SSOUtils.writeMultipleLogSummary(false, gs.getMessage("SessionIndex value not found"), gs.getMessage("Could not extract SessionIndex from SAMLResponse"), '');&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError("Could not extract SessionIndex from SAMLResponse");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData(eventLogParm1, eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return this.propertiesGR.failed_requirement_redirect;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logDebug("SAML2 SessionIndex: " + sessionIndex);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // pass these values to Logout script&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!SSO_Helper.isTestSAMLConnection()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.getSession().setAttribute("glide.saml2.session_index", sessionIndex);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.getSession().setAttribute("glide.saml2.session_id", nameId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.getSession().setAttribute("glide.multiSSO.logout_url", this.logoutURL);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.getSession().setAttribute("glide.multiSSO.service_url", this.serviceURL);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return this.loginUser(nameId, eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; setActionRedirectURL: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var url = null;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var isTestConn = GlideController.getGlobal("sysparm_saml_tc");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ("true" == isTestConn) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logDebug("request type : " + this.requestType);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (this.requestType == "logoutResponse") {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url = "/saml_test_conn_logout_completed.do?sysparm_nostack=true&amp;amp;sysparm_test_sso_id=" + this.propertiesGR.getUniqueValue();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url = "/saml_test_conn_completed.do?sysparm_nostack=true&amp;amp;sysparm_test_sso_id=" + this.propertiesGR.getUniqueValue();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (this.redirectURL) &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url = this.redirectURL;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(url){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logDebug("We will be redirecting user to the URL: " + url);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; action.setRedirect(url);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; loginUser : function (nameId, eventLogParm2) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (nameId == null) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData("", eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return this.propertiesGR.failed_requirement_redirect;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var eventLogParm1 = "user_name=" + nameId; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!this.userField || this.userField == ''){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var errorMessage = gs.getMessage("User Field validation failed");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SSOUtils.writeLogSummary(false, errorMessage, gs.getMessage("Ensure that the 'User Field' field is not null or blank"));&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError(errorMessage);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData(eventLogParm1,eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }else if(!GlideTableDescriptor.fieldExists('sys_user',this.userField)) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var errorMessage = gs.getMessage("Invalid User Field. {0} is not a field on the sys_user table.", this.userField);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SSOUtils.writeLogSummary(false, gs.getMessage("User Field validation failed"), errorMessage);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError(errorMessage);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData(eventLogParm1,eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var ugr = new GlideRecord("sys_user");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ugr.addQuery(this.userField, nameId);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ugr.query();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var foundUser = ugr.next();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!foundUser) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (! SSO_Helper.isTestSAMLConnection()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.importOrUpdateSAMLUser();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; ugr.query(); // query again to make sure import is successful&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; foundUser = ugr.next();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (!foundUser) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var errorMessage = gs.getMessage("User: ") + nameId + gs.getMessage(" not found");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SSOUtils.writeMultipleLogSummary(false, errorMessage, gs.getMessage("Ensure that the user you are trying the test connection with is present in the system."), 'userField');&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError(errorMessage);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData(eventLogParm1,eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else if(SSO_Helper.isTestSAMLConnection()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(ugr.locked_out == true) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var errorMessage = gs.getMessage("User: ") + nameId + gs.getMessage(" is locked out");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SSOUtils.writeMultipleLogSummary(false, errorMessage, gs.getMessage("Ensure that the user you are trying the test connection with is active and not locked out."), 'userField');&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError(errorMessage);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData(eventLogParm1,eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(ugr.active == false){&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var errorMessage = gs.getMessage("User: ") + nameId + gs.getMessage(" is not active");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SSOUtils.writeMultipleLogSummary(false, errorMessage, gs.getMessage("Ensure that the user you are trying the test connection with is active."), 'userField');&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError(errorMessage);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData(eventLogParm1,eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (this.propertiesGR.auto_update_user)&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; this.importOrUpdateSAMLUser();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var userName = ugr.getValue("user_name");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ( GlideStringUtil.nil(userName) ) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginFailureEventData(eventLogParm1, eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logError("user_name value is empty.");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "failed_authentication";&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // only set the cookie if it is NOT testing&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (! SSO_Helper.isTestSAMLConnection()) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.redirectURL = request.getSession().getAttribute("SAML_RelayState");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (! this.redirectURL) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.logDebug("SAML_RelayState is not available in the session, try the RelayState in the request.");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.redirectURL = request.getParameter("RelayState");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SecurityEventSender.sendSAMLLoginSuccessEventData(eventLogParm1, eventLogParm2);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.getSession().setAttribute("SAML_RelayState", null);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // successfully logged in. we need set sso_id cookie&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.ssoHelper.saveInCookie(SNC.SSOUtils.SSOID(), this.propertiesGR.sys_id);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.getSession().setAttribute("glide.authenticate.multisso.login.method", "saml");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return userName;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; importOrUpdateSAMLUser: function() {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; // will try to update table schema and insert the import set row&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; if (SNC.SSOUtils.isAutoProvisiongEnabled() &amp;amp;&amp;amp; this.propertiesGR.auto_provision) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; var userImportTable = this.propertiesGR.transform_map.source_table;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SSO_Helper.debug("SAML User Import Table: " + userImportTable);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var userProvising = new MultiSSO_SAML2_UserProvisioning(userImportTable, this.SAML2.SAMLAssertion, this.propertiesGR.getUniqueValue());&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; userProvising.loadImportSet();&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; logDebug : function (msg) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.SAML2.logDebug(msg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; logError : function (msg) {&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var lMsg = gs.getMessage(msg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (! SSO_Helper.isTestSAMLConnection())&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gs.addErrorMessage(lMsg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (SSO_Helper.isTestSAMLConnection())&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNC.SSOUtils.writeToLogStream(0, lMsg);&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gs.logError(lMsg, "SAML2");&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;BR /&gt;&lt;P&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/P&gt;&lt;BR /&gt;&lt;P&gt;});&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 07 Dec 2016 23:12:18 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142067#M798993</guid>
      <dc:creator>Blaze2</dc:creator>
      <dc:date>2016-12-07T23:12:18Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142068#M798994</link>
      <description>&lt;P&gt;My bad! Hope you found the answer now.&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Thu, 08 Dec 2016 10:35:29 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142068#M798994</guid>
      <dc:creator>sudharsanv36</dc:creator>
      <dc:date>2016-12-08T10:35:29Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142069#M798995</link>
      <description>&lt;P&gt;Thanks Blaze, but the script I was looking for was the script for the form "Single Sign-on". If you filter for that you will find the that form.&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;Thanks again.&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Thu, 08 Dec 2016 21:04:21 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142069#M798995</guid>
      <dc:creator>xmikeam</dc:creator>
      <dc:date>2016-12-08T21:04:21Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142070#M798996</link>
      <description>&lt;P&gt;When I filter SSO these are the results I get \&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="find_real_file.png"&gt;&lt;img src="https://www.servicenow.com/community/image/serverpage/image-id/76388i5DFFC1E9437F4163/image-size/large?v=v2&amp;amp;px=999" role="button" title="find_real_file.png" alt="find_real_file.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Thu, 08 Dec 2016 23:25:12 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142070#M798996</guid>
      <dc:creator>Blaze2</dc:creator>
      <dc:date>2016-12-08T23:25:12Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142071#M798997</link>
      <description>&lt;P&gt;Did you ever get this figured out? &lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 18 Jan 2017 15:08:08 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142071#M798997</guid>
      <dc:creator>Blaze2</dc:creator>
      <dc:date>2017-01-18T15:08:08Z</dc:date>
    </item>
    <item>
      <title>Re: Where is the Single Sign-On script located?</title>
      <link>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142072#M798998</link>
      <description>&lt;P&gt;I wasn't able to locate the script. I no longer need to locate it.&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 18 Jan 2017 16:05:53 GMT</pubDate>
      <guid>https://www.servicenow.com/community/developer-forum/where-is-the-single-sign-on-script-located/m-p/2142072#M798998</guid>
      <dc:creator>xmikeam</dc:creator>
      <dc:date>2017-01-18T16:05:53Z</dc:date>
    </item>
  </channel>
</rss>

