Azure APIM如何验证JWT与Ocp-Apim-Subscription-Key归属同一用户
APIM跨凭证盗用防护方案
你当前的配置仅对JWT和Ocp-Apim-Subscription-Key分别做了合法性校验,未做二者的主体关联校验,才会出现不同用户的凭证混用可正常访问的漏洞,可通过以下方案修复:
核心修复步骤
- 提前确认AAD B2C签发的JWT中包含用户唯一标识声明,通常默认自带
oid声明(对应用户在AAD B2C中的全局唯一ID),如果没有可以在B2C的用户流中配置新增该声明的释放。 - 在Azure APIM的对应API/产品的入站策略中添加主体绑定校验规则,示例策略如下:
<policies> <inbound> <!-- 校验订阅密钥与JWT用户主体一致性 --> <choose> <when condition="@(context.User.Id != context.Jwt.Claims.GetValueOrDefault("oid", ""))"> <return-response> <set-status code="403" reason="Forbidden" /> <set-body>订阅凭证与用户身份不匹配</set-body> </return-response> </when> </choose> </inbound> </policies>
上述策略的逻辑为:先获取当前请求所用订阅密钥对应的APIM用户ID,再解析JWT拿到oid声明的用户ID,二者不一致直接返回403拒绝访问。
- 如果你是给企业合作伙伴开通的订阅,订阅归属是应用而非个人用户,就把校验逻辑替换为JWT中的
appid声明和订阅关联的应用ID比对即可。
补充加固方案
- 为所有订阅设置密钥过期时间,每3~6个月强制轮换一次,降低密钥泄露后的长期风险。
- 把JWT的有效时长控制在30分钟以内,即使JWT被盗,可用窗口也非常有限。
- 新增访问行为风控规则:同一订阅密钥1小时内出现3个以上不同用户ID的JWT访问时,自动触发密钥冻结和告警通知。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

