暂存Azure网站

时间:2013-03-02 12:03:13

标签: azure testing web azure-web-sites staging

我是Azure的新手,我正在开发一个使用新网站模式而不是云服务的项目。我想建立一个像这样的持续交付流程:http://www.windowsazure.com/en-us/develop/net/common-tasks/publishing-with-tfs/

但是,在每次持续部署后,我都不希望我的网站可公开寻址。相反,我希望我的持续部署只能由我的团队访问以进行测试。如何最好地实现这一目标?

到目前为止的想法:

  • 将整个网站包装在表单身份验证中 - 但我不喜欢这样的事实,即这意味着我将部署不同版本的网站进行生产,而不是部署到测试中。
  • IP地址限制 - 但我不知道这是否可以通过Azure网站完成,以及这是否是一个很好的解决方案?

3 个答案:

答案 0 :(得分:2)

您可以使用URL重写模块添加IP限制,默认情况下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"(IPv6中的localhost)以匹配您允许的IP,例如pattern="87.236.134.47"或多个:

pattern="(62\.231\.142\.233)|(87\.236\.134\.47)|(::1)|(127\.0\.0\.1)"

答案 1 :(得分:2)

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/

答案 2 :(得分:1)

我必须为客户端执行类似操作,但无法找到限制从Azure门户本身访问网站的方法。我选择了IP地址限制选项,但是通过应用程序本身的代码完成了它。我的应用程序已经在使用表单身份验证,因此我可以在登录操作中执行IP地址检查。

在你的情况下,我会建议custom action filter。执行过滤器中的检查,如果不允许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);
    }
}