У меня проблема с доступом к MDS через обратный прокси. Ниже приведена упрощенная схема сети моей инфраструктуры.
Итак, в основном у меня есть 2 сервера приложений для ssrs и mds соответственно и один веб-сервер. Плюс есть балансировщик нагрузки, который обслуживает запросы к веб-серверу. Я использую Basic Authentication
везде.
У меня есть обратная настройка прокси на веб-сервере, который переписывает URL-адрес на сервер mds или ssrs на основе /mds
или /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 / не авторизованы.
Я не уверен, чтоидет не так, и почему ssrs в порядке, но mds нет. Оцените любые указатели.
Спасибо.
Обновление (20191008) -
На панели консоли отображались ошибки, связанные с «Access-Control-Allow-Origin»"поэтому я добавил пользовательские заголовки на веб-сайт MDS. Но проблема остается.
Обновление (20191009) -
Я думаю, что я должен указать точкувопрос. Я сравнил заголовки запросов при непосредственном вызове сервера приложений, а затем через обратный прокси-сервер. Я понял, что при звонке через прокси заголовок "Авторизация" отсутствует. Похоже, что прокси отбрасывает заголовок авторизации.
Это обычное поведение? Как применить заголовок авторизации при вызове через прокси-сервер?
И почему он работает с SSRS, а не с MDS?