Я установил обратный прокси-сервер в экземпляре веб-приложения 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>
Решено! После кучи писем в службу поддержки Azure (которые были удивительно компетентными) мы получили исправление.
Основная проблема заключалась в том, что наш веб-экземпляр Azure с обратным прокси-сервером находится за балансировщиком нагрузки Azure, что означает, что технически мы отстаем от «другого» обратного прокси-сервера. Таким образом, пока наш обратный прокси-сервер получал заголовок X-ARR-CLIENTCERT, он не мог переслать его нашему основному приложению, стоящему за ним.
Решение заключалось в том, чтобы переписать заголовок X-ARR-CLIENTCERT во временный заголовок, а затем обновить наше приложение .net для чтения из этого временного заголовка вместо стандартного X-ARR-CLIENTCERT.
поэтому нам пришлось обновить наш файл xdt, чтобы добавить
, а затем отредактировать наш веб-сайт .config, чтобы добавить
Затем наш код просто прочитал HTTP-X-PRIVATE-TOKEN, и все было готово.
Я потратил кучу времени, пытаясь решить эту проблему, и подумал, что отправлю ответ здесь для потомков. Я попросил MS обновить свою документацию, чтобы поговорить об этом подробнее.