Промежуточные веб-сайты Azure

Я новичок в Azure и работаю над проектом, в котором используется новая модель веб-сайтов, а не облачных служб. Я хочу настроить процесс непрерывной доставки, подобный этому: http://www.windowsazure.com/en-us/develop/net/common-tasks/publishing-with-tfs/

Однако я не хочу, чтобы мой сайт был общедоступным после каждого непрерывного развертывания. Вместо этого я хочу, чтобы мои непрерывные развертывания были доступны только моей команде для целей тестирования. Как этого лучше всего достичь?

Мысли до сих пор:

  • Оберните весь сайт аутентификацией с помощью форм, но мне не нравится тот факт, что это означает, что я буду развертывать другую версию моего сайта для производства, а не ту, которую я развертываю для тестирования.
  • Ограничения по IP-адресам — но я не знаю, можно ли это сделать с веб-сайтами Azure и является ли это хорошим решением?

person John    schedule 02.03.2013    source источник


Ответы (3)


Функция проверки подлинности/авторизации веб-сайтов Azure была разработана для поддержки именно этого сценария. По сути, вы создаете слот сайта, добавляете в него аутентификацию AAD с помощью нескольких щелчков мыши, и с этого момента для вашего промежуточного слота всегда будет требоваться действительный вход в систему, даже после того, как вы выполните операцию обмена.

Сообщение в блоге: http://azure.microsoft.com/blog/2014/11/13/azure-websites-authentication-authorization/

Демонстрационное видео: http://azure.microsoft.com/en-us/documentation/videos/azure-websites-easy-authentication-and-authorization-with-chris-gillum/

person Chris Gillum    schedule 24.01.2015

Вы можете добавить ограничения IP-адресов с помощью модуля перезаписи URL-адресов, который, по-видимому, включен на веб-сайтах Azure по умолчанию.

Ваш web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="SayNoToZombies" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{REMOTE_ADDR}" pattern="::1" negate="true" />
                    </conditions>
                    <action type="CustomResponse" statusCode="403" statusReason="Forbidden: Access is denied." statusDescription="Sorry, you're not allowed" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Вы можете заменить pattern="::1" (localhost в IPv6) подходящим регулярным выражением, соответствующим вашему разрешенному IP-адресу, например, pattern="87.236.134.47" или, если их несколько:

pattern="(62\.231\.142\.233)|(87\.236\.134\.47)|(::1)|(127\.0\.0\.1)"
person Tom Crane    schedule 09.04.2013
comment
Спасибо, Том. Мне нравится тот факт, что это решение на основе конфигурации позволит мне использовать преобразования web.config, чтобы легко применить это ограничение во время тестирования, но снять его при сборке для производства. - person John; 09.04.2013

Пришлось сделать нечто подобное для клиента, но я не смог найти способ ограничить доступ к сайту с самого портала Azure. Я пошел с опцией ограничения IP-адреса, но сделал это через код в самом приложении. В моем приложении уже использовалась проверка подлинности с помощью форм, поэтому я мог выполнить проверку IP-адреса при входе в систему.

В вашем случае я бы предложил настраиваемый фильтр действий< /а>. Выполните проверку в фильтре и, если IP-адрес не разрешен, верните код состояния http 401 (неавторизованный).

Создайте параметр приложения с именем AllowedIpAddresses или что-то подобное, в котором вы можете добавить список разрешенных IP-адресов, разделенных запятыми. Когда вы выполняете проверку, вы можете настроить свой сайт так, чтобы разрешать весь трафик, если AllowedIpAddresses пуст или не существует. Таким образом, вы можете игнорировать этот параметр в рабочей среде, и весь трафик будет разрешен по умолчанию. Вы можете настроить пользовательские параметры приложения для каждого сайта на портале Azure.

Вот как может выглядеть пользовательский фильтр. Я не тестировал это!

public class AccessRestrictionFilterAttribute : ActionFilterAttribute
{
    // simple wrapper around ConfigurationManager.AppSettings for testability
    private readonly IAppSettingsHandler appSettingsHandler;

    public AccessRestrictionFilterAttribute(IAppSettingsHandler appSettingsHandler)
    {
        this.appSettingsHandler = appSettingsHandler;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var isAllowed = false;
        var userIpAddress = filterContext.HttpContext.Request.UserHostAddress;
        if (appSettingsHandler.AllowedIpAddresses.Split(new[] { ',' }).Any(x => x == userIpAddress))
        {
            isAllowed = true;
        }

        if (!isAllowed)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }

        base.OnActionExecuting(filterContext);
    }
}
person levelnis    schedule 02.03.2013