You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure App Service如何针对特定URL端点(如/admin)配置访问限制?

针对Azure App Service特定URL端点的IP访问限制方案

方案1:App Service Access Restriction路径规则(原生支持)

Azure App Service的Access Restriction功能支持针对特定路径配置IP规则,你之前可能没注意到路径配置项:

  • 登录Azure门户,进入目标App Service的网络 > 访问限制页面
  • 点击添加规则,配置以下内容:
    • 规则类型选择允许,填写允许访问的IP地址/地址段(如192.168.0.1或10.0.0.0/24)
    • 在路径输入框中指定要限制的端点,比如/admin/*(支持通配符匹配子路径)
    • 调整规则优先级:数字越小优先级越高,确保该路径规则优先级高于全局默认规则
  • 保存后,仅指定IP能访问/admin开头的路径,其他路径不受限制

方案2:Azure应用网关实现URL级控制

如果需要更复杂的流量管理或WAF防护,可通过应用网关作为前端代理:

  • 部署Azure应用网关,将你的App Service配置为后端池
  • 在应用网关中创建路径规则,匹配/admin/*路径
  • 为该路径规则绑定IP限制策略,仅放行指定IP
  • 其他路径配置默认路由规则,不做IP限制

方案3:应用代码层自定义中间件(开发自主应用)

若你的Web应用是自主开发的(如ASP.NET Core、Node.js等),可在代码中直接实现IP校验:

  • 以ASP.NET Core为例,添加自定义中间件到请求管道:
app.Use(async (context, next) =>
{
    // 允许的IP列表,支持单个IP或CIDR段
    var allowedIps = new List<string> { "192.168.1.5", "172.16.0.0/16" };
    var requestPath = context.Request.Path.Value;

    if (requestPath.StartsWith("/admin", StringComparison.OrdinalIgnoreCase))
    {
        var clientIp = context.Connection.RemoteIpAddress?.ToString();
        bool isAllowed = allowedIps.Any(ip => CheckIpInRange(clientIp, ip));

        if (!isAllowed)
        {
            context.Response.StatusCode = StatusCodes.Status403Forbidden;
            await context.Response.WriteAsync("Access Denied");
            return;
        }
    }

    await next();
});

// 辅助方法:检查IP是否在指定CIDR段内
private bool CheckIpInRange(string clientIp, string cidr)
{
    var parts = cidr.Split('/');
    var ipAddress = IPAddress.Parse(parts[0]);
    var subnetMask = int.Parse(parts[1]);

    var client = IPAddress.Parse(clientIp);
    var mask = IPAddress.Parse(GetSubnetMask(subnetMask));

    var network = ipAddress.GetAddressBytes();
    var clientBytes = client.GetAddressBytes();
    var maskBytes = mask.GetAddressBytes();

    for (int i = 0; i < network.Length; i++)
    {
        if ((network[i] & maskBytes[i]) != (clientBytes[i] & maskBytes[i]))
        {
            return false;
        }
    }
    return true;
}

private string GetSubnetMask(int prefixLength)
{
    var mask = new uint[4];
    for (int i = 0; i < 4; i++)
    {
        if (prefixLength >= 8)
        {
            mask[i] = 0xFF;
            prefixLength -= 8;
        }
        else
        {
            mask[i] = (uint)(0xFF << (8 - prefixLength));
            prefixLength = 0;
        }
    }
    return $"{mask[0]}.{mask[1]}.{mask[2]}.{mask[3]}";
}

方案选择建议

  • 优先选方案1:原生功能,无需额外资源,配置简单
  • 方案2适合多应用统一管控、需要WAF或复杂路由的场景
  • 方案3适合需要高度自定义访问逻辑的开发场景

内容的提问来源于stack exchange,提问作者Arman Avetisyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:20:22