Статьи

Использование клиентских сертификатов в Windows Azure

В одном из текущих проектов нам нужно было развернуть один сайт Windows Azure, который поддерживает SSL и требует клиентских сертификатов. Пока речь не идет о развертывании сайта SSL в Windows Azure, в этом нет ничего сложного, но когда требуется изменить настройки IIS, необходимо некоторое кодирование. Вот пример.

обзор

В облачном проекте можно настроить все необходимое для развертывания сайта SSL для вычисления экземпляра (сертификаты, конечные точки, заголовки хостов и т. Д.). Изменение настроек IIS во время или после развертывания не так просто. Сценарий запуска, который можно указать в файле определения облачной службы, запускается до того, как сайты будут настроены на IIS, и единственным способом изменить параметры IIS, по-видимому, является момент запуска веб-роли.

NB!  В этой публикации я ожидаю, что вы уже знаете, как развернуть сайт SSL в Windows Azure, и вы знакомы с файлами определения и конфигурации службы. Вы можете найти больше на странице Windows Azure  Настройка SSL для приложения в Windows Azure .

Решение

В качестве решения мы вносим изменения в конфигурацию IIS при запуске веб-роли. На данный момент сайты на IIS созданы и мы можем получить к ним доступ. Для доступа к настройкам сайта нам нужна библиотека для управления IIS и повышенные привилегии для веб-роли. В этих условиях мы можем изменить настройки сайта.

1. Ссылка Microsoft.Web.Administration

Щелкните правой кнопкой мыши веб-приложение и добавьте ссылку NuGet в пакет Microsoft.Web.Administration.

Пакет Microsoft.Web.Administration NuGet

2. Добавить точку входа WebRole

Добавьте новый класс WebRole.cs в веб-приложение, которое вы хотите развернуть в Windows Azure. Код взят из публикации Ману Коэн-Яшара о размещении  клиентских сертификатов в Windows Azure .

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        try
        {
            using (var server = new ServerManager())
            {
                var siteNameFromServiceModel = "Web"; // TODO: update this site name for your site. 
                var siteName = string.Format("{0}_{1}", RoleEnvironment.CurrentRoleInstance.Id, siteNameFromServiceModel);

                var config = server.GetApplicationHostConfiguration();
                var accessSection = config.GetSection("system.webServer/security/access", siteName);
                accessSection["sslFlags"] = @"Ssl,SslRequireCert";
 
                server.CommitChanges();
            }
        }
        catch (Exception ex)
        {
            // handle error here

        }
        return base.OnStart();
    }
}

Если вам нужны другие настройки для SSL, взгляните на  список флагов SSL в IIS.NET .

3. Запустите веб-роль с повышенными привилегиями.

Теперь откройте файл ServiceDefinition.csdef из проекта развертывания Windows Azure и добавьте туда следующий XML:

<Runtime executionContext="elevated" />

Вставьте его прямо под узлом <WebRole>.

Теперь вы готовы построить свое решение и попробовать, если развертывание работает как положено.

NB! Перед развертыванием сайта SSL в Windows Azure убедитесь, что у вас есть загруженные сертификаты и настройки DNS. В противном случае вы можете столкнуться с трудностями при отладке ошибок, и официальной технической поддержки больше не будет.

Если все прошло хорошо, вы должны увидеть следующий экран при открытии настроек Windows Azure IIS через удаленный рабочий стол:

IIS в Windows Azure использует SSL и необходимые клиентские сертификаты

Таким же образом вы также можете изменить все другие параметры IIS для своей веб-роли.

Вывод

Поскольку сценарии запуска запускаются на слишком ранней стадии развертывания, мы не можем использовать их для изменения настроек сайта, поскольку сайт IIS еще не развернут. Мы смогли использовать метод запуска веб-роли для внесения изменений в IIS. Мы использовали простую библиотеку Microsoft.Web.Administration, чтобы сделать код простым. Может быть, это не лучший способ, как это делать, но в большинстве случаев это работает, и мне удалось развернуть сайт, который аутентифицирует пользователей с использованием эстонской ID-карты.