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

如何在Application Insights中记录Azure APIM的用户访问信息

目标

通过Application Insights(AI)确定谁在访问Azure APIM中的哪些API端点。

假设
  • 用户 = 个人或后端服务
  • 多个用户可能共享同一个Subscription Key

举个极端例子,假设有10000个用户共享同一个订阅密钥(这可能不是正确做法,但请继续阅读)。

环境配置

已启用APIM向AI和Log Analytics工作区发送日志
Application Insights配置界面

尝试1

本地通过Postman使用订阅密钥调用API端点,随后在虚拟机上重复操作。AI中生成两条日志记录,包含不同IP地址和同一个订阅密钥。

ApiManagementGatewayLogs
| project TimeGenerated, CallerIpAddress, ApiId, OperationId, ApimSubscriptionId

AI日志展示

尝试2

在APIM实例中进入监控-->分析并点击用户标签,未获取到关于“用户”的有效信息。
APIM监控分析用户标签界面

讨论

Standard v2版本的APIM实例可创建无限数量的订阅密钥,或许应为10000个用户分别创建密钥(将其视为API密钥),但未找到相关具体指导。

若未提供身份信息,APIM无法识别访问者,因此考虑采用JWT验证机制,用户获取令牌后调用网关,从JWT声明中提取用户名或系统信息,疑问在于能否将该信息添加到AI日志中。


问题解答

是否应将订阅视为API密钥?

Azure APIM的订阅本身就是用于API访问授权的密钥载体,完全可以当作API密钥使用,具体分场景:

  • 若需区分单个用户/独立服务实例的访问,每个主体对应独立订阅密钥是合理且推荐的方案,Standard v2版本支持创建大量订阅(无明确上限),满足10000个用户的场景需求;
  • 若为团队、租户级批量授权,可使用产品级订阅(将多个API打包为产品分配订阅),但这种模式无法追踪个体访问者。

订阅密钥是否应由多个用户或后端服务共享?

不建议共享订阅密钥:

  1. 无法精准追踪访问主体:共享密钥下只能看到IP和订阅ID,无法区分具体发起请求的用户/服务;
  2. 安全风险高:密钥泄露会影响所有共享主体,且难以定位泄露源;
  3. 权限管控粒度不足:无法针对单个用户调整API访问权限,只能整体启用/禁用订阅。

如何扩展Application Insight日志以包含JWT声明等额外信息?

通过APIM策略实现,步骤如下:

  1. 配置JWT验证:在API或产品层面添加validate-jwt策略,验证令牌有效性并确保包含所需声明:
    <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Invalid token">
        <openid-config url="https://你的身份提供商地址/.well-known/openid-configuration" />
        <required-claims>
            <claim name="sub" />
        </required-claims>
    </validate-jwt>
    
  2. 提取并注入自定义字段:使用set-variable提取JWT声明,再通过add-custom-logging将信息加入网关日志:
    <set-variable name="userId" value="@(context.Request.Headers.GetValueOrDefault("Authorization","").Split(' ')[1].AsJwt()?.Claims.FirstOrDefault(c => c.Type == "sub")?.Value)" />
    <add-custom-logging>
        <logger-id>applicationinsights</logger-id>
        <message>UserId: @((string)context.Variables["userId"])</message>
        <severity>Information</severity>
        <custom-dimensions>
            <dimension name="UserId" value="@((string)context.Variables["userId"])" />
            <dimension name="ApiId" value="@(context.Api.Id)" />
        </custom-dimensions>
    </add-custom-logging>
    
  3. 查询日志:配置完成后,JWT声明信息会出现在ApiManagementGatewayLogs的CustomDimensions列中,可通过Kusto查询获取:
    ApiManagementGatewayLogs
    | project TimeGenerated, CallerIpAddress, ApiId, OperationId, ApimSubscriptionId, CustomDimensions.UserId
    

也可使用track-custom-event策略将信息发送到AI的customEvents表,通过关联查询整合网关日志与用户身份信息。


内容的提问来源于stack exchange,提问作者chrisbuttacavoli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:20:07