reporting-services - 具有反向代理的主数据服务

标签 reporting-services reverse-proxy url-rewrite-module iis-10 master-data-services

我在通过反向代理访问 MDS 时遇到问题。
下面是我的基础设施设置的简化网络图。
enter image description here

所以,基本上我有 2 个分别用于 ssrs 和 mds 的应用程序服务器和一个 Web 服务器。
此外,还有一个负载均衡器可以为 Web 服务器提供请求。
我正在使用 Basic Authentication到处。

我在 web 服务器上设置了反向代理,它根据 /mds 将 url 重写为 mds 或 ssrs 服务器。或 /reports .

入站规则 -

<rules>
                <rule name="SSRS Reverse Proxy" stopProcessing="true">
                    <match url="^reports/(.*)" />
                    <action type="Rewrite" url="http://App1_IP/{R:0}" logRewrittenUrl="false" />
                    <serverVariables>
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                    </serverVariables>
                </rule>
                <rule name="SSRS Report Server Reverse Proxy" stopProcessing="true">
                    <match url="^reportserver/(.*)" />
                    <action type="Rewrite" url="http://App1_IP/{R:0}" logRewrittenUrl="false" />
                    <serverVariables>
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                    </serverVariables>
                </rule>
                <rule name="MDS Reverse Proxy" stopProcessing="true">
                    <match url="^mds/(.*)" />
                    <action type="Rewrite" url="http://App2_IP/{R:0}" logRewrittenUrl="false" />
                    <serverVariables>
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                    </serverVariables>
                </rule>
            </rules>

出站规则 -
<outboundRules>
                <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://App1_IP/(.*)" />
                    <action type="Rewrite" value="http{R:1}://WebServer_IP/{R:2}" />
                </rule>
                <rule name="ReverseProxyOutboundRule2" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://App2_IP/(.*)" />
                    <action type="Rewrite" value="http{R:1}://WebServer_IP/{R:2}" />
                </rule>
                <rule name="ResponseAcceptEncoding" preCondition="NeedRestoringAcceptEncoding">
                    <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" />
                    <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" />
                </rule>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                    <preCondition name="NeedRestoringAcceptEncoding">
                        <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".*|" />
                    </preCondition>
                </preConditions>
            </outboundRules>

SSRS 规则运行良好。但是当用户访问MDS时,页面无法正常显示,并不断提示输入用户名和密码。当我查看网络流量时,似乎对一些 javascript 文件和/MDS/api/的调用是未经授权的。

enter image description here

我不确定出了什么问题,为什么 ssrs 可以,但 mds 不行。感谢任何指针。

谢谢。

更新 (20191008) -

控制台面板显示与“Access-Control-Allow-Origin”相关的错误,所以我在 MDS 网站中添加了自定义标题。但问题仍然存在。

enter image description here

更新 (20191009) -

我想我已经指出了这个问题。我在直接调用应用服务器然后通过反向代理时比较了请求 header 。我意识到通过代理调用时,缺少“授权” header 。似乎代理删除了授权 header 。

这是正常的行为吗?通过代理调用时如何强制使用授权 header ?

为什么它与 SSRS 一起工作而不是与 MDS 一起工作?

最佳答案

你真的应该更换 WebServer_IP在您的出站重写规则中使用 {HTTP_HOST} (我认为这是 IIS 的正确表示法,它应该解析为客户端请求的主机)。这应该避免 CORS 机制启动(以及访问服务所需的 SSL 证书、NATting、本地主机或 dns 条目可能存在的问题)。

此外,如果 CORS 到位,您将需要一些特殊的 CORS 配置以允许浏览器发送凭据。

此外,您可以发布更多来自控制台的错误消息的详细信息(related to "Access-Control-Allow-Origin" 非常模糊)。

关于reporting-services - 具有反向代理的主数据服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58217137/

相关文章:

reporting-services - SSRS 递归计数 - 如何仅为子级而不是父级获取聚合?

reporting-services - Reporting Services 从表达式中的 DateTime 中删除时间

c# - 如何使用自定义授权扩展连接到 SSRS API

asp.net-mvc - 如何在IIS/ASP.NET网站上使用清漆/鱿鱼?

asp.net - Visual Studio无法在mvc3网站web.config中识别ssl和rewrite标签

iis - 如何为 IIS 应用程序正确应用 URL 重写规则

excel - 从 SSRS 导出到 Excel 时列宽发生变化

ubuntu - 使用 2 级代理的 Nginx Web 服务器

ASP.NET - 将所有 https 请求重写为 http

apache - Apache中反向代理的无限超时