Azure APIM与Function App后端认证:x-functions-key有效性及移除疑问
问题
我们通过APIM向客户端暴露了若干Function App API,当前正在测试认证流程:客户端使用订阅密钥访问APIM网关,后端授权通过APIM的AAD授权或托管标识实现。
我们已按照官方文档配置AAD客户端凭证授权,使用的策略如下:
<inbound> <base /> <get-authorization-context provider-id="aad2" authorization-id="aad2" context-variable-name="auth-context" identity-type="managed" ignore-error="false" /> <set-header name="authorization" exists-action="override"> <value>@("Bearer " + ((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</value> </set-header> <set-header name="apikey" exists-action="delete" /> <set-header name="x-functions-key" exists-action="delete" /> </inbound>
同时按照第三方文档配置了托管标识认证,策略如下:
<base /> <authentication-managed-identity resource="xxxx-xxx-4xxb-xxx-xxxxxxx" output-token-variable-name="msi-access-token" ignore-error="false" /> <set-header name="Authorization" exists-action="override"> <value>@("Bearer " + (string)context.Variables["msi-access-token"])</value> </set-header>
两种场景下,追踪显示请求头已携带令牌且请求成功,但不确定是否是x-functions-key在起作用。尝试通过策略移除该请求头但未成功,若从Function App中移除则会返回401未授权错误。
现需咨询:如何验证是哪种认证方式生效?x-functions-key是否可移除,还是必须保留?
解决方案
一、验证当前生效的认证方式
可以通过以下几种方式确认:
- 临时禁用Function App的密钥验证:
在Function App配置里,暂时关闭函数密钥认证(比如将FUNCTIONS_AUTH_ENABLED设为false,或针对单个函数关闭密钥要求),再发起请求。如果请求仍成功,说明是APIM传递的AAD/托管标识令牌在生效;如果返回401,说明之前确实是x-functions-key在起作用。 - 解析Bearer令牌内容:
从APIM追踪日志里提取Authorization头的Bearer令牌,用JWT解析工具查看iss(签发者)、aud(受众)字段:- 托管标识生成的令牌,
iss通常是https://sts.windows.net/{租户ID}/,aud会匹配你配置的resource参数值; - AAD客户端凭证的令牌,
iss同样是AAD的STS地址,但appid字段对应配置的AAD应用ID。
- 托管标识生成的令牌,
- 添加策略日志输出:
在APIM inbound策略末尾添加日志,输出令牌变量的值,确认是否正确获取:
同时在Function App代码里加日志,打印收到的请求头,确认<log-to-eventhub logger-id="your-logger-id"> <value>@($"Auth token: {context.Variables.GetValueOrDefault("auth-context")?.AccessToken ?? context.Variables.GetValueOrDefault("msi-access-token")}")</value> </log-to-eventhub>x-functions-key是否被移除、Authorization头是否存在。
二、关于x-functions-key的移除问题
能否移除取决于Function App的认证配置:
- 若要完全依赖APIM的AAD/托管标识认证:
需要在Function App中配置AAD身份验证,关闭密钥认证:- 在Function App的「身份验证」页面添加AAD提供商,配置允许的受众(对应APIM托管标识或AAD应用的ID);
- 关闭「允许匿名请求」,将「未认证请求的操作」设为「返回401」;
- 移除所有函数的密钥配置,或设置
FUNCTIONS_AUTH_ENABLED为false(全局关闭密钥认证)。
完成后,x-functions-key可通过APIM策略彻底移除,请求仅通过Bearer令牌授权。
- 若需同时支持密钥和令牌认证:
x-functions-key需要保留,但可通过APIM策略控制是否传递。不过建议统一认证方式,避免混淆。
另外,你提到策略移除x-functions-key未成功,可能是执行顺序问题:检查策略是否在<base />之后执行,确保set-header delete操作覆盖base策略中可能添加的密钥。可以把删除x-functions-key的配置放在策略最后,确保优先执行删除。
内容的提问来源于stack exchange,提问作者Shafeeq
相关产品推荐
相关产品推荐

