Azure APIM与Function Apps:仅允许APIM通过用户分配标识访问应用
背景
原本通过函数密钥的后端连接访问Function Apps,现计划改用托管标识实现APIM的隐式授权访问,并拒绝直接调用Function Apps。
已完成的配置步骤
- 创建用户分配托管标识(User Managed Identity)
- 为该标识分配所有目标Function Apps的Contributor角色
- 将此标识关联到APIM
- 更新APIM的API策略,添加以下配置:
<authentication-managed-identity resource="${function_id}" output-token-variable-name="msi-access-token" ignore-error="false" client-id="#{function_access_client_id}" />
其中参数说明:
function_id:曾使用Function Apps的资源ID,也尝试过填入https://management.azure.com/function_access_client_id:用户分配托管标识的客户端ID
遇到的配置问题
- 当
function_id使用https://management.azure.com/时,能成功获取令牌,但该令牌无法通过Function Apps的身份验证 - 当
function_id使用Function Apps的资源ID时,触发如下错误:
"errorResponse": "System.InvalidOperationException: [MSAL] Authentication failed for ClientId:
Certificate: AuthorizationUrl: https://login.windows.net/ resourceId: /subscriptions/ /resourceGroups/ /providers/Microsoft.Web/sites/ ---> Microsoft.Identity.Client.MsalServiceException: AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope /subscriptions/ /resourceGroups/ /providers/Microsoft.Web/sites/ /.default is not valid.
另一个特殊情况:将client-id设为Function Apps身份验证提供程序的ID时,配置能正常工作,但移除APIM的用户分配托管标识后,会因APIM未启用托管标识而失败。
核心疑问
当前可用的配置逻辑存在矛盾:
- 用户分配托管标识用于授权访问应用,但它生成的JWT并未被实际使用
- Function Apps必须配置JWT身份验证
- APIM策略需要引用Function Apps身份验证配置中的客户端ID
这种配置虽能运行,但逻辑怪异,是否存在配置错误?用户分配托管标识在此场景中的真正作用是什么?
内容的提问来源于stack exchange,提问作者Jake Boomgaarden

