CAS Disable Service X-Frame-Options 不起作用

CAS Disable Service X-Frame-Options not work

我已经将 CAS 服务器设置为多个网站的 SSO 解决方案。
我使用 JSON 文件作为服务注册表。但是,我只想禁用其中一个网站的 X-Frame-Options,因为它是一个使用 iframe 在其中嵌入一些模块的旧网站。出于安全原因,我不想在其他网站禁用 X-Frame-Options。
我为这些网站成功设置了 CAS,但是,我无法为该特定旧网站禁用 X-Frame-Options。

CAS版本是5.3,我这里使用CAS官网的配置:
https://apereo.github.io/cas/5.3.x/installation/Configuring-Service-Http-Security-Headers.html
这是我的 JSON 遗留网站文件:

{
  "@class": "org.apereo.cas.services.RegexRegisteredService",
  "serviceId": "^https://my-internal-site.com.*",
  "name": "mysite",
  "id": 1001,
  "evaluationOrder": 5,
  "attributeReleasePolicy": {
    "@class": "org.apereo.cas.services.ReturnMappedAttributeReleasePolicy",
    "authorizedToReleaseProxyGrantingTicket": true,
    "allowedAttributes": {
      "@class": "java.util.TreeMap",
      "username": "username",
      "personUuid": "personUuid"
    }
  },
  "proxyPolicy": {
    "@class": "org.apereo.cas.services.RegexMatchingRegisteredServiceProxyPolicy",
    "pattern": "^https://.+"
  },
  "properties" : {
    "@class" : "java.util.HashMap",
    "httpHeaderEnableXFrameOptions" : {
      "@class" : "org.apereo.cas.services.DefaultRegisteredServiceProperty",
      "values" : [ "java.util.HashSet", [ "false" ] ]
    }
  }
}

我尝试通过CAS Dashboard查看配置,发现CAS已经识别我的配置,我可以在"mysite".
中看到httpHeaderEnableXFrameOptions的配置 但是,我仍然无法为我的旧网站 (mysite) 禁用 X-Frame-Options。
我的配置有什么问题吗?还是我需要设置任何其他配置才能仅针对该旧版网站禁用 X-Frame-Options?
谢谢

我已经帮你查看了代码,看到这两个位置决定了X-Frame-Options是否生效:

将两个来源合并在一起并进行一些释义,我们得到了这个:

X-Frame-Options启用/禁用的逻辑

    @Override
    protected void decideInsertXFrameOptionsHeader(final HttpServletResponse httpServletResponse, final HttpServletRequest httpServletRequest) {
        // Check A
        if (shouldHttpHeaderBeInjectedIntoResponse(httpServletRequest,
            RegisteredServiceProperties.HTTP_HEADER_ENABLE_XFRAME_OPTIONS)) {
            final String xFrameOptions = getStringProperty(httpServletRequest, RegisteredServiceProperties.HTTP_HEADER_XFRAME_OPTIONS);
            super.insertXFrameOptionsHeader(httpServletResponse, httpServletRequest, xFrameOptions);
        } else {
             // Check B
             if (!this.enableXFrameOptions) {
                 return;
             }
             insertXFrameOptionsHeader(httpServletResponse, httpServletRequest);
        }
    }

分析逻辑

有两种方法可以影响是否启用 xframe 选项的结果:

  1. this.enableXFrameOptions,即here
  2. 中的cas.httpWebRequest.header.xframe
  3. 服务中的 httpHeaderEnableXFrameOptions,已在问题中链接

如果我们制作一个 table 显示设置以上 2 个值将如何影响显示或不显示 XFrameOptions 的最终结果:

+--------------------------------+-------------------------------------------+---------------------+
|  enableXFrameOptions property  |  httpHeaderEnableXFrameOptions in service |  Is XFrame Enabled? |
+--------------------------------------------------------------------------------------------------+
|         true                   |                 true                      |        true         |
+--------------------------------------------------------------------------------------------------+
|         false                  |                 true                      |        true         |
+--------------------------------------------------------------------------------------------------+
|         true                   |                 false                     |       *true*        |
+--------------------------------------------------------------------------------------------------+
|         false                  |                 false                     |        false        |
+--------------------------------+-------------------------------------------+---------------------+

这就是为什么在您的情况下,当您设置时:

  1. this.enableXFrameOptions = 真(默认)
  2. 服务中的 httpHeaderEnableXFrameOptions = false

结果仍然是 true,因此您在结果中看到了。

解决方案

一个愚蠢的解决方案(未测试)是将 cas.httpWebRequest.header.xframe 设置为 false, 并确保您的所有服务都标有 httpHeaderEnableXFrameOptions = true,当然还有遗留网站

另一个解决方案是对 CAS 进行自定义更改以修改此行为

或者也许还有其他解决方案,如果是这样,也许其他人可以提供帮助:)