You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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策略末尾添加日志,输出令牌变量的值,确认是否正确获取:
    <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>
    
    同时在Function App代码里加日志,打印收到的请求头,确认x-functions-key是否被移除、Authorization头是否存在。

二、关于x-functions-key的移除问题

能否移除取决于Function App的认证配置:

  • 若要完全依赖APIM的AAD/托管标识认证:
    需要在Function App中配置AAD身份验证,关闭密钥认证:
    1. 在Function App的「身份验证」页面添加AAD提供商,配置允许的受众(对应APIM托管标识或AAD应用的ID);
    2. 关闭「允许匿名请求」,将「未认证请求的操作」设为「返回401」;
    3. 移除所有函数的密钥配置,或设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:37:07