使用参数设置 iFrame 的 src 会导致 X-Frame-Options 'SAMEORIGINS' 错误

Setting the src of an iFrame with parameters causes X-Frame-Options 'SAMEORIGINS' error

我目前正在开发一个网站,我的客户端使用 angularjs,服务器端使用 Web API 2

首先,我尝试使用 iframeSSRS 报告嵌入我的网站。只要我向 iframe src 提供以下(示例)link:

,我就可以成功嵌入报告

http://EXAMPLE-LINK/reports/report/Test%20Upgrade/Line%20Control?rs:embed=true

下图是成功加载到网站的报告(快乐的日子):

其次,每当我使用相同的 link 但这次为其提供参数来填充 "Between" 和 "And" 字段时,我都会收到以下控制台错误:

我用的link里面的参数详细如下:

http://EXAMPLE-LINK/reports/report/Test%20Upgrade/Line%20Control?&date1=01/03/2018&date2=04/04/2018?rs:embed=true

最后,当我为 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 以遵循下面的结构,其中包括我的参数:

http://EXAMPLE-LINK/reports/report/Test%20Upgrade/Line%20Control?rs:embed=true&date1=01/03/2018&date2=04/04/2018

如您所见,我在 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 服务才能使用此方法使更改生效。