同一Azure APIM下API互调无需订阅密钥的配置方法
实现Azure APIM内部API互调免订阅密钥,外部调用需验证密钥的配置方案
核心思路
通过APIM的策略条件判断,识别请求是否来自APIM自身实例:内部调用时跳过订阅密钥验证,外部调用强制验证密钥。
具体配置步骤
为目标API添加条件化订阅验证策略
登录Azure门户进入你的APIM实例,分别对API A和API B执行以下操作:- 进入API的「设计」标签页,找到「入站处理」区域,点击「添加策略」
- 选择「高级编辑器」,替换为以下策略代码:
<choose> <!-- 识别APIM内部调用:请求Host匹配APIM服务名 --> <when condition="@(context.Request.OriginalUrl.Host.Equals(context.Deployment.ServiceName, StringComparison.OrdinalIgnoreCase))"> <!-- 内部调用直接放行,跳过密钥验证 --> </when> <!-- 外部调用强制验证订阅密钥 --> <otherwise> <check-subscription key-header="Ocp-Apim-Subscription-Key" /> </otherwise> </choose> - 保存策略,确保该策略在入站处理中优先执行(避免被其他策略干扰)
配置API内部调用的地址
当API A调用API B(或反向调用)时,必须使用APIM的默认服务域名(格式:{你的APIM服务名}.azure-api.net)发起请求。此时请求Host会匹配APIM服务名,触发策略中的内部调用判断,跳过密钥验证。验证配置效果
- 内部调用测试:在APIM门户的「测试」控制台调用API A,触发其对API B的内部调用,确认无需携带订阅密钥即可成功返回结果
- 外部调用测试:用Postman、curl等工具直接请求API A/B的公网地址,不携带
Ocp-Apim-Subscription-Key头部时,应返回401 Unauthorized;携带有效密钥则正常响应
注意事项
- 如果APIM使用了自定义域名,建议内部调用仍用默认服务域名,外部调用使用自定义域名,条件判断可正常生效
- 若需支持自定义域名下的内部调用,可修改条件判断逻辑,将自定义域名加入允许列表,例如:
<when condition="@(context.Request.OriginalUrl.Host.Equals(context.Deployment.ServiceName, StringComparison.OrdinalIgnoreCase) || context.Request.OriginalUrl.Host.Equals("你的自定义域名", StringComparison.OrdinalIgnoreCase))"> - 确保API A和API B都应用了上述条件策略,双向互调才能均免密钥
内容的提问来源于stack exchange,提问作者Juan Francisco Porto
相关产品推荐
相关产品推荐

