如何将Azure API管理订阅密钥传递至Azure Function?
传递Azure API管理订阅密钥至Azure Function方案
问题原因
你遇到的情况是因为APIM调用Azure Function时,如果Function开启了密钥验证,APIM会自动在请求中带上Function的订阅密钥,这导致你读取ocp-apim-subscription-key时拿到的是Function的密钥,而非用户调用APIM时传入的APIM订阅密钥。
解决方法
1. 通过APIM入站策略转发密钥
在APIM的API入站策略中,把用户传入的APIM订阅密钥复制到一个自定义请求头里,这样后端Function就能读取这个自定义头获取到APIM的密钥。
示例策略代码:
<inbound> <!-- 将APIM订阅密钥存入自定义请求头 --> <set-header name="x-apim-subscription-key" exists-action="override"> <value>@(context.Request.Headers.GetValueOrDefault("ocp-apim-subscription-key", ""))</value> </set-header> <!-- 保留其他现有入站策略 --> </inbound>
2. 在Azure Function中读取自定义头
在Function代码里读取这个自定义请求头即可拿到APIM的订阅密钥:
- C#示例:
var apimSubscriptionKey = req.Headers["x-apim-subscription-key"].FirstOrDefault();
- Python示例:
apim_subscription_key = req.headers.get('x-apim-subscription-key')
3. 不推荐方案:关闭Function密钥验证
如果你的Function仅通过APIM对外暴露,可以关闭Function的密钥验证,这样APIM不会自动添加Function密钥头,你直接读取ocp-apim-subscription-key就能拿到APIM的密钥。但这种做法会让Function失去一层安全防护,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者roblem
相关产品推荐
相关产品推荐

