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是否生效:
- https://github.com/apereo/cas/blob/v5.3.14/core/cas-server-core-web-api/src/main/java/org/apereo/cas/services/web/support/RegisteredServiceResponseHeadersEnforcementFilter.java#L57
- https://github.com/apereo/cas-server-security-filter/blob/master/src/main/java/org/apereo/cas/security/ResponseHeadersEnforcementFilter.java#L281
将两个来源合并在一起并进行一些释义,我们得到了这个:
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 选项的结果:
- this.enableXFrameOptions,即here
中的cas.httpWebRequest.header.xframe
- 服务中的 httpHeaderEnableXFrameOptions,已在问题中链接
如果我们制作一个 table 显示设置以上 2 个值将如何影响显示或不显示 XFrameOptions 的最终结果:
+--------------------------------+-------------------------------------------+---------------------+
| enableXFrameOptions property | httpHeaderEnableXFrameOptions in service | Is XFrame Enabled? |
+--------------------------------------------------------------------------------------------------+
| true | true | true |
+--------------------------------------------------------------------------------------------------+
| false | true | true |
+--------------------------------------------------------------------------------------------------+
| true | false | *true* |
+--------------------------------------------------------------------------------------------------+
| false | false | false |
+--------------------------------+-------------------------------------------+---------------------+
这就是为什么在您的情况下,当您设置时:
- this.enableXFrameOptions = 真(默认)
- 服务中的 httpHeaderEnableXFrameOptions = false
结果仍然是 true,因此您在结果中看到了。
解决方案
一个愚蠢的解决方案(未测试)是将 cas.httpWebRequest.header.xframe
设置为 false,
并确保您的所有服务都标有 httpHeaderEnableXFrameOptions = true
,当然还有遗留网站
另一个解决方案是对 CAS 进行自定义更改以修改此行为
或者也许还有其他解决方案,如果是这样,也许其他人可以提供帮助:)
我已经将 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是否生效:
- https://github.com/apereo/cas/blob/v5.3.14/core/cas-server-core-web-api/src/main/java/org/apereo/cas/services/web/support/RegisteredServiceResponseHeadersEnforcementFilter.java#L57
- https://github.com/apereo/cas-server-security-filter/blob/master/src/main/java/org/apereo/cas/security/ResponseHeadersEnforcementFilter.java#L281
将两个来源合并在一起并进行一些释义,我们得到了这个:
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 选项的结果:
- this.enableXFrameOptions,即here 中的cas.httpWebRequest.header.xframe
- 服务中的 httpHeaderEnableXFrameOptions,已在问题中链接
如果我们制作一个 table 显示设置以上 2 个值将如何影响显示或不显示 XFrameOptions 的最终结果:
+--------------------------------+-------------------------------------------+---------------------+
| enableXFrameOptions property | httpHeaderEnableXFrameOptions in service | Is XFrame Enabled? |
+--------------------------------------------------------------------------------------------------+
| true | true | true |
+--------------------------------------------------------------------------------------------------+
| false | true | true |
+--------------------------------------------------------------------------------------------------+
| true | false | *true* |
+--------------------------------------------------------------------------------------------------+
| false | false | false |
+--------------------------------+-------------------------------------------+---------------------+
这就是为什么在您的情况下,当您设置时:
- this.enableXFrameOptions = 真(默认)
- 服务中的 httpHeaderEnableXFrameOptions = false
结果仍然是 true,因此您在结果中看到了。
解决方案
一个愚蠢的解决方案(未测试)是将 cas.httpWebRequest.header.xframe
设置为 false,
并确保您的所有服务都标有 httpHeaderEnableXFrameOptions = true
,当然还有遗留网站
另一个解决方案是对 CAS 进行自定义更改以修改此行为
或者也许还有其他解决方案,如果是这样,也许其他人可以提供帮助:)