基于Azure Foundry搭建自助AI服务:APIM订阅密钥解析问题求助
背景
我们基于Azure API Management Service(APIM)对接Azure Foundry(AI网关)搭建了AI权限管理流程:用户申请AI权限→管理员审批→用户获取API密钥并配置到AI工具。APIM中定义了completions等API并配置策略,开启「必须订阅」后,客户端需通过Header/Query参数传递订阅密钥。
问题现象
Postman通过Ocp-Apim-Subscription-Key或api-key头传递密钥可正常工作,但VSCode等AI工具会发送格式为Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx的Authorization头,APIM无法解析其中的密钥,导致这类请求无法被APIM内部验证机制识别,也无法在APIM Analytics中被监控到。
尝试的解决方案及调试结果
我编写了以下入站策略,试图提取密钥并重写Ocp-Apim-Subscription-Key头,期望让APIM识别该密钥,但context.Subscription?.Key始终无法更新:
<set-variable name="clientKey" value="@{ var auth = context.Request.Headers.GetValueOrDefault("Authorization", ""); if (auth.StartsWith("Bearer ")) { var token = auth.Substring(7).Trim(); if (token != "") { return token; } } var apiKey = context.Request.Headers.GetValueOrDefault("api-key", "").Trim(); if (apiKey != "") { return apiKey; } var subKey = context.Request.Headers.GetValueOrDefault("Ocp-Apim-Subscription-Key", "").Trim(); if (subKey != "") { return subKey; } return ""; }" /> <set-header name="Ocp-Apim-Subscription-Key" exists-action="override"> <value>@((string)context.Variables["clientKey"])</value> </set-header>
调试发现:
- 使用以下出站策略验证,
clientKey已被正确赋值:<return-response> <set-status code="200" reason="DEBUG" /> <set-body>@((string)context.Variables["clientKey"])</set-body> </return-response> - 但使用以下出站策略时,
context.Subscription为null:<return-response> <set-status code="200" reason="DEBUG" /> <set-body> @{ return "Subscription Key=" + (context.Subscription?.Key); } </set-body> </return-response>
这说明context.Subscription的评估早于入站策略执行,且不会重新评估。虽然当前策略能提取密钥用于令牌限制,但无法被APIM内部机制识别。由于Azure Foundry本身支持Bearer格式的Authorization头,需要找到让APIM适配该场景的解决思路。
内容的提问来源于stack exchange,提问作者Stavros Koureas
相关产品推荐
相关产品推荐

