Access Manager IDP server doubles CORS header after getting swicthed to another IDP cluster node

  • 7024493
  • 22-Mar-2020
  • 22-Mar-2020

Environment

Access Manager 4.4.x
Access Manager 4.5.x

Situation

  • Access Manager 4.5.1 IDP cluster behind a Layer 4 Switch
  • CORS header have been enabled from with the "/opt/novell/nids/lib/webapp/WEB-INF/web.xml"

  • Flow:
    • user runs a login to IDP cluster node "IDPA"
    • user sends another request to the IDP server and gets switch by the L4 to cluster node "IDPB"
    • IDPB does not have any existing user session  information
    • based on the "UrnNovellNidpClusterMemberId" cookie IDPB sends a "proxy" request to IDPA in order to retrieve the user session information
    • IDPB response to browser with the requested web object adding the CORS header doubled:
GET https://idpa.kgast.nam.com:8443/nidp/portal?locale=en_US HTTP/1.1
Host: idpa.kgast.nam.com:8443
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,de;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://idpa.kgast.nam.com:8443/nidp/app?sid=0
DNT: 1
Connection: keep-alive
Cookie: JSESSIONID=AE8005B6A29F2D57B9E7C38B99CFA008; UrnNovellNidpClusterMemberId=~03~06~7Bdd~19~19~1A~7E~7D~7C~06; JSESSIONID=4837761005D907BF691D17A517923815
Upgrade-Insecure-Requests: 1
HTTP/1.1 200
via-ESP: null,NIDPLOGGING.600105004 session33-D9F7507C905C00A2050E1F1969E7ABCD, null,NIDPLOGGING.600105004 session33-D9F7507C905C00A2050E1F1969E7ABCD,NIDPLOGGING.600105006 session22-D9F7507C905C00A2050E1F1969E7ABCD, null,NIDPLOGGING.600105004 session33-D9F7507C905C00A2050E1F1969E7ABCD,NIDPLOGGING.500105001 session44-D9F7507C905C00A2050E1F1969E7ABCD, null,NIDPLOGGING.600105004 session33-D9F7507C905C00A2050E1F1969E7ABCD,NIDPLOGGING.600105007 session55-D9F7507C905C00A2050E1F1969E7ABCD
Access-Control-Expose-Headers: Access-Control-Allow-Origin,Access-Control-Allow-Credentials, Access-Control-Allow-Origin,Access-Control-Allow-Credentials
Server: IDPA
Access-Control-Allow-Origin: *, *
Content-Disposition: attachment
Content-Encoding: gzip
Date: Sun, 22 Mar 2020 10:25:21 GMT
Set-Cookie: JSESSIONID=BDD02CB56482C21C4C305935293EB1BC; Path=/nidp/; Secure; HttpOnly
Content-Type: application/json;charset=utf-8
Content-Length: 577
  • This caused the browser error: "XMLHttpRequest blocked by CORS policy"

Resolution

  • make sure the complete CORS headers section including the "CorsFilterController" filter gets un-commented

    <filter>
        <filter-name>CorsFilterController</filter-name>
        <filter-class>com.novell.nidp.servlets.filters.CorsFilterController</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CorsFilterController</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
        <init-param>
            <param-name>cors.allowed.origins</param-name>
            <param-value>*</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.methods</param-name>
            <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.headers</param-name>
            <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
        </init-param>
        <init-param>
            <param-name>cors.exposed.headers</param-name>
            <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>

Cause

  • The Access Manager IDP "CorsFilterController" filter had not been enabled / un-commented. This filter is required to make sure headers do not get added again due the situation and IDP to IDP proxy request is required.
    <!-- login snippet related cors -->
    <!-- Note: Do not modify the default wildcard in the url-pattern. This is needed by the portal to function properly. -->
    <!--
    <filter>
      <filter-name>CorsFilterController</filter-name>
      <filter-class>com.novell.nidp.servlets.filters.CorsFilterController</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CorsFilterController</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>
    -->
    <filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <init-param> <param-name>cors.allowed.origins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> </init-param> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> <init-param> <param-name>cors.exposed.headers</param-name> <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> </init-param> </filter>
    <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping>



Additional Information

The Access Manager IDP server provides and requires an extra Tomcat Filter which makes sure CORS headers will not get doubled
<filter>
  <filter-name>CorsFilterController</filter-name>
  <filter-class>com.novell.nidp.servlets.filters.CorsFilterController</filter-class>
</filter>
<filter-mapping>
    <filter-name>CorsFilterController</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>
Additional Information about the Tomcat CORS filter setting can be reviewed at the Container Provided Filters documentation for Tomcat