X-ARR-ClientCert не передается из обратного прокси-сервера веб-приложения Azure в другое веб-приложение Azure.

Я установил обратный прокси-сервер в экземпляре веб-приложения Azure, который переписывает URL-адрес и принудительно устанавливает SSL для нашего основного приложения .NET веб-приложения Azure. . Все идет хорошо.

Мы хотим развернуть аутентификацию сертификата клиента в этом .NET-приложении. У нас это работает напрямую с экземпляром веб-приложения Azure приложения .NET, но нам нужно, чтобы он проходил через обратный прокси-сервер веб-приложения Azure.

Похоже, что обратный прокси-сервер получает информацию X-ARR-ClientCert (я вижу ее в трассировке неисправности), но не передает эту информацию основному веб-серверу. Я копал всюду и не могу найти ничего, что говорило бы, что это невозможно. На самом деле это должно быть вполне возможно, и есть множество сообщений, в которых говорится, что людям удалось это сделать в IIS.

Мне интересно, есть ли у меня просто тупая ошибка конфигурации в моем web.config или это ограничение веб-приложения Azure, которое не задокументировано.

Любая помощь или понимание были бы потрясающими. Вот мой файл web.config , где mainazurewebapp.azurewebsites.com - это наше основное приложение .NET, которое работает, если вы заходите туда напрямую и аутентифицируетесь с помощью сертификата клиента.

<system.webServer>
    <security>
    <requestFiltering removeServerHeader="true"/>
    </security>
    <httpProtocol>
        <customHeaders>
            <clear />
            <add name="X-Frame-Options" value="SAMEORIGIN" />
            <add name="X-Xss-Protection" value="1; mode=block" />
            <add name="X-Content-Type-Options" value="nosniff" />
        </customHeaders>
    </httpProtocol>
    <httpErrors errorMode="Detailed" />
    <rewrite>
      <rules>
        <rule name="ForceSSL" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
                </rule>
                
        <rule name="Proxy" stopProcessing="true">
          <match url="(.*)" />
          <action type="Rewrite" url="https://mainazurewebapp.azurewebsites.net/{R:1}"/>
        <serverVariables>
                        <set name="HTTP_X_UNPROXIED_URL" value="https://mainazurewebapp.azurewebsites.net/{R:1}" /> 
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /> 
                        <set name="HTTP_X_ORIGINAL_HOST" value="{HTTP_HOST}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
            </serverVariables>
        </rule>
      </rules>
     <outboundRules>
                <rule name="Add Strict-Transport-Security only when using HTTPS" enabled="true">
                    <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                    </conditions>
                <action type="Rewrite" value="max-age=31536000; includeSubdomains; preload" />
                </rule>
                                
                <rule name="ChangeReferencesToOriginalUrl" patternSyntax="ExactMatch" preCondition="CheckContentType">
                    <match filterByTags="None" pattern="https://mainazurewebapp.azurewebsites.net" />
                    <action type="Rewrite" value="https://{HTTP_X_ORIGINAL_HOST}" />
                </rule>
                <preConditions>
                    <preCondition name="CheckContentType">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^(text/html|text/plain|text/xml|application/rss\+xml)" />
                    </preCondition>
                </preConditions>
     </outboundRules>
     </rewrite>
  </system.webServer>
</configuration>
0
задан 16 March 2021 в 16:34
1 ответ

Решено! После кучи писем в службу поддержки Azure (которые были удивительно компетентными) мы получили исправление.

Основная проблема заключалась в том, что наш веб-экземпляр Azure с обратным прокси-сервером находится за балансировщиком нагрузки Azure, что означает, что технически мы отстаем от «другого» обратного прокси-сервера. Таким образом, пока наш обратный прокси-сервер получал заголовок X-ARR-CLIENTCERT, он не мог переслать его нашему основному приложению, стоящему за ним.

Решение заключалось в том, чтобы переписать заголовок X-ARR-CLIENTCERT во временный заголовок, а затем обновить наше приложение .net для чтения из этого временного заголовка вместо стандартного X-ARR-CLIENTCERT.

поэтому нам пришлось обновить наш файл xdt, чтобы добавить

, а затем отредактировать наш веб-сайт .config, чтобы добавить

Затем наш код просто прочитал HTTP-X-PRIVATE-TOKEN, и все было готово.

Я потратил кучу времени, пытаясь решить эту проблему, и подумал, что отправлю ответ здесь для потомков. Я попросил MS обновить свою документацию, чтобы поговорить об этом подробнее.

0
ответ дан 24 April 2021 в 02:08

Теги

Похожие вопросы