如何在Application Insights中记录Azure APIM的用户访问信息
目标
通过Application Insights(AI)确定谁在访问Azure APIM中的哪些API端点。
假设
- 用户 = 个人或后端服务
- 多个用户可能共享同一个Subscription Key
举个极端例子,假设有10000个用户共享同一个订阅密钥(这可能不是正确做法,但请继续阅读)。
环境配置
已启用APIM向AI和Log Analytics工作区发送日志
尝试1
本地通过Postman使用订阅密钥调用API端点,随后在虚拟机上重复操作。AI中生成两条日志记录,包含不同IP地址和同一个订阅密钥。
ApiManagementGatewayLogs | project TimeGenerated, CallerIpAddress, ApiId, OperationId, ApimSubscriptionId

尝试2
在APIM实例中进入监控-->分析并点击用户标签,未获取到关于“用户”的有效信息。
讨论
Standard v2版本的APIM实例可创建无限数量的订阅密钥,或许应为10000个用户分别创建密钥(将其视为API密钥),但未找到相关具体指导。
若未提供身份信息,APIM无法识别访问者,因此考虑采用JWT验证机制,用户获取令牌后调用网关,从JWT声明中提取用户名或系统信息,疑问在于能否将该信息添加到AI日志中。
问题解答
是否应将订阅视为API密钥?
Azure APIM的订阅本身就是用于API访问授权的密钥载体,完全可以当作API密钥使用,具体分场景:
- 若需区分单个用户/独立服务实例的访问,每个主体对应独立订阅密钥是合理且推荐的方案,Standard v2版本支持创建大量订阅(无明确上限),满足10000个用户的场景需求;
- 若为团队、租户级批量授权,可使用产品级订阅(将多个API打包为产品分配订阅),但这种模式无法追踪个体访问者。
订阅密钥是否应由多个用户或后端服务共享?
不建议共享订阅密钥:
- 无法精准追踪访问主体:共享密钥下只能看到IP和订阅ID,无法区分具体发起请求的用户/服务;
- 安全风险高:密钥泄露会影响所有共享主体,且难以定位泄露源;
- 权限管控粒度不足:无法针对单个用户调整API访问权限,只能整体启用/禁用订阅。
如何扩展Application Insight日志以包含JWT声明等额外信息?
通过APIM策略实现,步骤如下:
- 配置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> - 提取并注入自定义字段:使用
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> - 查询日志:配置完成后,JWT声明信息会出现在
ApiManagementGatewayLogs的CustomDimensions列中,可通过Kusto查询获取:ApiManagementGatewayLogs | project TimeGenerated, CallerIpAddress, ApiId, OperationId, ApimSubscriptionId, CustomDimensions.UserId
也可使用track-custom-event策略将信息发送到AI的customEvents表,通过关联查询整合网关日志与用户身份信息。
内容的提问来源于stack exchange,提问作者chrisbuttacavoli
相关产品推荐
相关产品推荐

