APIM策略需求:基于FrontDoorID头或IP过滤器放行流量
正确的APIM策略配置方案
核心解决思路
利用APIM的<choose>条件分支策略,实现满足任一校验条件即放行的逻辑:
- 优先校验
X-Azure-FDID请求头,若匹配直接转发流量 - 当头校验不通过时,再检查请求IP是否在允许列表,匹配则放行
- 两者均不满足时,返回403拒绝请求
完整策略代码
<policies> <inbound> <choose> <!-- 分支1:X-Azure-FDID头校验通过,直接放行 --> <when condition="@(context.Request.Headers.GetValueOrDefault("X-Azure-FDID", "").Equals("{FrontDoorId}", StringComparison.OrdinalIgnoreCase))"> <forward-request /> </when> <!-- 分支2:头校验不通过,检查IP是否在允许列表 --> <when condition="@(context.Request.IpAddress != null && new System.Collections.Generic.List<string> { "{IpAddress}" }.Contains(context.Request.IpAddress))"> <forward-request /> </when> <!-- 默认分支:两者都不满足,拒绝请求 --> <otherwise> <return-response> <set-status code="403" reason="Forbidden" /> <set-body>{"error": "请求无效 - FrontDoor ID头不正确或IP不在允许列表"}</set-body> </return-response> </otherwise> </choose> </inbound> <backend /> <outbound /> <on-error /> </policies>
关键配置说明
- 条件分支逻辑:通过
<choose>替代原有的顺序执行校验,避免"双重校验都需通过"的问题 - 头校验分支:直接判断请求头值是否匹配目标ID,匹配后立即执行
<forward-request>转发流量,跳过后续逻辑 - IP校验分支:仅当头校验失败时触发,将允许的IP放入List集合中,支持单个IP或CIDR网段(多个IP用逗号分隔添加进List即可)
- 错误处理:默认分支统一返回403状态码和自定义错误信息,明确拒绝原因
内容的提问来源于stack exchange,提问作者ruggler
相关产品推荐
相关产品推荐

