使用参数设置 iFrame 的 src 会导致 X-Frame-Options 'SAMEORIGINS' 错误
Setting the src of an iFrame with parameters causes X-Frame-Options 'SAMEORIGINS' error
我目前正在开发一个网站,我的客户端使用 angularjs
,服务器端使用 Web API 2
。
首先,我尝试使用 iframe
将 SSRS
报告嵌入我的网站。只要我向 iframe
src 提供以下(示例)link:
,我就可以成功嵌入报告
http://EXAMPLE-LINK/reports/report/Test%20Upgrade/Line%20Control?rs:embed=true
下图是成功加载到网站的报告(快乐的日子):
其次,每当我使用相同的 link 但这次为其提供参数来填充 "Between" 和 "And" 字段时,我都会收到以下控制台错误:
我用的link里面的参数详细如下:
最后,当我为 iframe
src a link 提供参数时,为什么会出现 X-Frame-Options 'SAMEORIGIN'
错误?理想情况下,我想为 iframe
src 提供参数,否则我将不得不创建多个报告来实现网站功能。
我可以在我的应用程序中做什么来忽略/删除 X-Frame-Options 'SAMEORIGIN'
header 响应?我是否需要在我的 web.config
中添加一些 customHeader
响应,或者有什么方法可以在我的网络应用程序启动期间删除 header 吗?
因此在尝试访问以下 link 之后:
http://EXAMPLE-LINK/reports/report/Test%20Upgrade/Line%20Control?&date1=01/03/2018&date2=04/04/2018?rs:embed=true 在我的浏览器中 URL 我收到了以下错误:
所以这让我相信我试图传递给 iframe
的 link 实际上是不正确的。
所以我修改了我的 link 以遵循下面的结构,其中包括我的参数:
如您所见,我在 SSRS
报告的参数之前传递了 rs:embed=true
标记,并且成功了!我现在可以在填充了 SSRS
报告参数的情况下加载我的 iframe
。
在SQLReport Server 2019中,您可以设置自定义Content-Security-Policy: frame-ancestors <uri>
header。至少在Chrome,它会尊重X-Frame-Option
之前的这个值。此外,我启用了 CORS。
这可以通过 SSMS 完成。连接到报表服务器实例,右键单击服务器和 select 属性。然后转到“高级”部分。在“User-defined”下,您会找到 AccessControlAllowOrigin
(CORS) 和 CustomHeaders
。以下是一些示例值:
AccessControlAllowOrigin: https://prod_app:8888/, http://dev_app:8888/
CustomHeaders: <CustomHeaders><Header><Name>Content-Security-Policy</Name><Pattern>.*</Pattern><Value>frame-ancestors https://prod_app:8888 http://prod_dev:8888</Value></Header></CustomHeaders>
这将使用协议 https
在端口 8888 上启用来自 prod_app
运行 的 cross-origin 请求,并允许来自所有来源的 iframe(不安全)。
由于一些看似 server-side 的缓存问题(ReportViewer.aspx 有一段时间没有应用自定义 header),我不得不重新启动报表服务器。
最后,如果您搞砸了报表服务器属性并且您的报表服务器无法加载(RSPortal.exe 错误等),那么您可以直接在 SQL 数据库中访问报表服务器属性,方法是转到 SQL 数据库 -> ReportServer -> dbo.ConfigurationInfo table 并清除或更新值。您必须重新启动报表服务器 windows 服务才能使用此方法使更改生效。
我目前正在开发一个网站,我的客户端使用 angularjs
,服务器端使用 Web API 2
。
首先,我尝试使用 iframe
将 SSRS
报告嵌入我的网站。只要我向 iframe
src 提供以下(示例)link:
http://EXAMPLE-LINK/reports/report/Test%20Upgrade/Line%20Control?rs:embed=true
下图是成功加载到网站的报告(快乐的日子):
其次,每当我使用相同的 link 但这次为其提供参数来填充 "Between" 和 "And" 字段时,我都会收到以下控制台错误:
我用的link里面的参数详细如下:
最后,当我为 iframe
src a link 提供参数时,为什么会出现 X-Frame-Options 'SAMEORIGIN'
错误?理想情况下,我想为 iframe
src 提供参数,否则我将不得不创建多个报告来实现网站功能。
我可以在我的应用程序中做什么来忽略/删除 X-Frame-Options 'SAMEORIGIN'
header 响应?我是否需要在我的 web.config
中添加一些 customHeader
响应,或者有什么方法可以在我的网络应用程序启动期间删除 header 吗?
因此在尝试访问以下 link 之后: http://EXAMPLE-LINK/reports/report/Test%20Upgrade/Line%20Control?&date1=01/03/2018&date2=04/04/2018?rs:embed=true 在我的浏览器中 URL 我收到了以下错误:
所以这让我相信我试图传递给 iframe
的 link 实际上是不正确的。
所以我修改了我的 link 以遵循下面的结构,其中包括我的参数:
如您所见,我在 SSRS
报告的参数之前传递了 rs:embed=true
标记,并且成功了!我现在可以在填充了 SSRS
报告参数的情况下加载我的 iframe
。
在SQLReport Server 2019中,您可以设置自定义Content-Security-Policy: frame-ancestors <uri>
header。至少在Chrome,它会尊重X-Frame-Option
之前的这个值。此外,我启用了 CORS。
这可以通过 SSMS 完成。连接到报表服务器实例,右键单击服务器和 select 属性。然后转到“高级”部分。在“User-defined”下,您会找到 AccessControlAllowOrigin
(CORS) 和 CustomHeaders
。以下是一些示例值:
AccessControlAllowOrigin: https://prod_app:8888/, http://dev_app:8888/
CustomHeaders: <CustomHeaders><Header><Name>Content-Security-Policy</Name><Pattern>.*</Pattern><Value>frame-ancestors https://prod_app:8888 http://prod_dev:8888</Value></Header></CustomHeaders>
这将使用协议 https
在端口 8888 上启用来自 prod_app
运行 的 cross-origin 请求,并允许来自所有来源的 iframe(不安全)。
由于一些看似 server-side 的缓存问题(ReportViewer.aspx 有一段时间没有应用自定义 header),我不得不重新启动报表服务器。
最后,如果您搞砸了报表服务器属性并且您的报表服务器无法加载(RSPortal.exe 错误等),那么您可以直接在 SQL 数据库中访问报表服务器属性,方法是转到 SQL 数据库 -> ReportServer -> dbo.ConfigurationInfo table 并清除或更新值。您必须重新启动报表服务器 windows 服务才能使用此方法使更改生效。