我在通过反向代理访问MDS时遇到问题。下面是我的基础设施的简化网络图。
因此,基本上,我有2个分别用于ssrs和mds的应用程序服务器和一个Web服务器。另外,还有一个负载平衡器,可以将请求提供给Web服务器。我到处都使用Basic Authentication
。
我在Web服务器上设置了反向代理,该代理基于/mds
或/reports
将URL重写为mds或ssrs服务器。
入站规则-
<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 /的调用是未授权的。
我不确定出什么问题,为什么ssrs可以,但是mds却不行。感谢任何指针。
谢谢。
更新(20191008)-
控制台面板显示与“ Access-Control-Allow-Origin”相关的错误,因此我在MDS网站中添加了自定义标头。但是问题仍然存在。
更新(20191009)-
我想我已经指出了问题所在。在直接调用应用服务器然后通过反向代理调用时,我比较了请求标头。我意识到,通过代理进行调用时,缺少“授权”标头。似乎代理会删除授权标头。
这是通常的行为吗?通过代理调用时如何执行授权标头?
为什么它与SSRS一起使用而不与MDS一起使用?
您确实应该用WebServer_IP
替换您的出站回程规则中的{HTTP_HOST}
(我认为这是IIS的正确符号,它应该解析为客户端请求的主机)。这应避免加入CORS机制(以及访问服务所需的SSL证书,NAT,本地主机或dns条目可能出现的问题)。
如果还有CORS,也需要特殊的CORS配置,以允许浏览器发送凭据。
此外,您可以从控制台发布更多详细的错误消息(related to "Access-Control-Allow-Origin"
非常模糊)。