如何配置Azure API Management默认拒绝所有请求仅允许指定API?
最优配置方案:Azure APIM 默认拒绝所有请求,特定API放行
一、全局默认拒绝配置(替代你的validate-jwt方案)
直接在**All APIs级别(全局策略)**添加return-response策略,无条件返回403拒绝请求。这种方式比检查不存在的JWT角色更高效(无需解析JWT),逻辑也更直观。
全局策略代码:
<policies> <inbound> <base /> <return-response> <set-status code="403" reason="Forbidden" /> <set-body>{"message": "Access denied by default policy"}</set-body> </return-response> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
二、特定API的放行配置
对于需要允许有效JWT请求的API,在该API(或具体操作)的策略中添加JWT验证逻辑,并且不要调用<base />——这样会跳过全局的默认拒绝策略,仅让通过JWT验证的请求流向后端。
特定API策略示例:
<policies> <inbound> <!-- 验证JWT的有效性、签名、声明等 --> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Invalid or missing JWT token"> <openid-config url="https://your-tenant-domain/.well-known/openid-configuration" /> <!-- 按需添加必要的声明验证,比如角色、受众等 --> <required-claims> <claim name="roles" match="any"> <value>authorized-api-role</value> </claim> <claim name="aud"> <value>your-api-audience</value> </claim> </required-claims> </validate-jwt> <!-- 注意:此处不添加<base />,避免执行全局的拒绝策略 --> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
三、方案优势对比
你原来用validate-jwt检查deny_all角色的方案存在两个明显问题:
- 性能浪费:所有请求都要解析JWT,哪怕是无需放行的请求;
- 逻辑不直观:其他维护人员看到策略时会疑惑为什么要检查一个不存在的角色。
而新方案的优势:
- 性能更优:默认请求直接返回403,无需解析任何请求内容;
- 逻辑清晰:全局策略明确是默认拒绝,特定API策略明确是放行条件;
- 灵活性高:可在API级别或操作级别精细控制放行范围,无需修改全局策略。
四、额外注意事项
- 策略执行顺序:全局inbound策略优先执行,若子级(API/操作)策略不调用
<base />,则不会触发全局的拒绝逻辑; - 错误区分:全局拒绝返回403(禁止访问),JWT验证失败返回401(未授权),便于前端区分处理;
- 精细控制:如果同一个API下仅部分操作需要放行,可仅在对应操作的策略中配置上述逻辑,其余操作自动继承全局拒绝。
内容的提问来源于stack exchange,提问作者Rungreung saksupan
相关产品推荐
相关产品推荐

