У нас есть веб-сайт, на котором имеется достаточное количество различных конечных точек веб-API, которые мы развертываем на большом количестве серверов с использованием пакета Microsoft Web Deploy.
По сути, наши сборочные машины компилируют решение, запускаютмодульные тесты, а затем публикует пакет развертывания.Когда мы продвигаем среду, она копирует пакет развертывания, копирует в него файл setparameters.xml этой среды.Затем результат копируется на конечный сервер и выполняется.
Проблема в том, что у нас есть один клиент, которому требуется пара конечных точек, которые используют клиентские сертификаты для аутентификации.
Проблема заключается в том, чточто в IIS веб-сайты не видят клиентские сертификаты, если они специально не настроены для их принятия.
Наша первая попытка состояла в том, чтобы просто зайти в настройки SSL сайтов в IIS Manager и установить для клиентских сертификатов значение «Принять».".
Оказывается, это не сработает, потому что некоторые клиенты, вызывающие другие конечные точки, ломаются, если сайт разрешает клиентские сертификаты.
Нашей второй попыткой было установить sslFlags в сети.config, ограниченный определенным путем:
<location path="api/XYZ">
<system.webServer>
<security>
<access sslFlags="SslNegotiateCert" />
</security>
</system.webServer>
</location>
Это работает отлично.Клиенты, которые получают доступ к конечным точкам api / XYZ, могут отправлять сертификаты клиентов, и их могут видеть действия контроллера, а клиенты, обращающиеся к другим конечным точкам, все еще работают.
Проблема в том, что sslFlags являетсязаблокированный параметр и требует, чтобы параметры FeatureDelegation / SSL были изменены с «Только чтение» на «Чтение / запись».
Это означает, что если мы поместим это в файл web.config, каждый экземпляр веб-сайта будет поврежден,пока кто-то не пройдет и не разблокирует настройки SSL на каждом сервере.Что некоторые из наших клиентов не допустят.
Таким образом, наша третья попытка состояла в том, чтобы попытаться создать параметр развертывания в файле parameters.xml, который бы записывал этот параметр для сайтов, которым это необходимо, а не для любых других.
Оказывается, что весь механизм parameters.xml / setParameters.xml не может вставлять новые элементы, кроме как путем включения экранированного XML в parameters.xml.
Например, если я помещу это вweb.config:
<location path="api/XYZ">
<system.webServer>
<security></security>
</system.webServer>
</location>
И это в settings.xml:
<parameter name="uncommentForXYZ"
defaultValue="<!-- <access sslFlags="SslNegotiateCert" /> -->"
tags="Boolean">
<parameterEntry kind="XmlFile" scope="\\web.config$"
match="/configuration/location[@path='api/XYZ']/system.webServer/security"
/>
</parameter>
Затем в SetParameters.xml я вижу:
<setParameter name="uncommentForXYZ" value="<!-- <access sslFlags="SslNegotiateCert" /> -->" />
После запускаразвертывание, которое я вижу в файле web.config:
<location path="api/XYZ">
<system.webServer>
<security></security>
</system.webServer>
</location>
Другими словами, поскольку значение по умолчанию в setparameters.xml является комментарием, в файл web.config ничего не добавляется.
Ноесли я отредактирую SetParameters.xml на:
<setParameter name="uncommentForSoCal" value="<access sslFlags="SslNegotiateCert" />" />
То, что я вижу в web.config:
<location path="api/XYZ">
<system.webServer>
<security><access sslFlags="SslNegotiateCert" /></security>
</system.webServer>
</location>
Что я хочу.
Но я ненавижуэто.
Есть ли лучший способ сделать это?
Есть ли что-то, что я могу сделать в параметреers.xml, который позволяет логическому значению в setparameters.xml выбирать между двумя разными частями XML для вывода?
Или я использую совершенно неправильный подход?