настройкаво время развертывания - PullRequest
0 голосов
/ 06 декабря 2018

У нас есть веб-сайт, на котором имеется достаточное количество различных конечных точек веб-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="&lt;!-- &lt;access sslFlags=&quot;SslNegotiateCert&quot; /> -->"
        tags="Boolean">
    <parameterEntry kind="XmlFile" scope="\\web.config$"
        match="/configuration/location[@path='api/XYZ']/system.webServer/security"
        />
</parameter>

Затем в SetParameters.xml я вижу:

<setParameter name="uncommentForXYZ" value="&lt;!-- &lt;access sslFlags=&quot;SslNegotiateCert&quot; /&gt; --&gt;" />

После запускаразвертывание, которое я вижу в файле web.config:

<location path="api/XYZ">
    <system.webServer>
        <security></security>
    </system.webServer>
</location>

Другими словами, поскольку значение по умолчанию в setparameters.xml является комментарием, в файл web.config ничего не добавляется.

Ноесли я отредактирую SetParameters.xml на:

<setParameter name="uncommentForSoCal" value="&lt;access sslFlags=&quot;SslNegotiateCert&quot; /&gt;" />

То, что я вижу в web.config:

<location path="api/XYZ">
    <system.webServer>
        <security><access sslFlags="SslNegotiateCert" /></security>
    </system.webServer>
</location>

Что я хочу.

Но я ненавижуэто.

Есть ли лучший способ сделать это?

Есть ли что-то, что я могу сделать в параметреers.xml, который позволяет логическому значению в setparameters.xml выбирать между двумя разными частями XML для вывода?

Или я использую совершенно неправильный подход?

...