如何在 Application Insights 中记录 Azure APIM 用户

问题描述 投票:0回答:1

目标

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

假设

  • 用户 = 个人或后端
  • 多个用户可能共享相同的订阅密钥

夸张地说,考虑拥有 10,000 个用户,并且他们共享相同的订阅密钥(也许这是一个错误的方法,但请继续阅读)。

设置

APIM 支持将日志发送到 AI 和 Log Analytics 工作区 Application Insights

尝试#1

我使用订阅密钥从我的计算机上的 Postman 访问 API 端点。然后我做了同样的事情,但是是从虚拟机上进行的。这导致 AI 中出现两个日志条目,具有 2 个不同的 IP 和相同的订阅。

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

AI Logs

尝试#2

在 APIM 实例中,我转到 Monitoring --> Analytics 并单击 Users 选项卡。这没有显示有关“用户”的任何有用信息。

Monitoring Analytics

讨论

看来可以为 Standardv2 APIM 实例创建无限数量的订阅密钥。在这种情况下,也许正确的方法是通过创建 10k 个密钥(将它们视为 API 密钥)来解决此问题,但我还没有找到具体的指导。

我不希望 APIM 在没有获得信息的情况下知道“谁”正在访问它。这就是为什么我认为我需要使用 JWT 验证,用户将获取令牌并调用网关。给定 JWT,可以从 JWT 声明中提取用户名或系统。一旦我收到用户声明,我是否能够使用该信息来丰富 AI 日志?

问题

  • 订阅是否应该被视为 API 密钥?
  • 订阅密钥应该由多个用户或后端共享吗?
  • 如何丰富 Application Insight 日志以包含其他信息,例如 JWT 声明?

我刚开始使用 Azure APIM,并期待在我们的团队中采用它。感谢您提前提供任何有用的建议!

azure azure-application-insights azure-api-management
1个回答
0
投票
  • 订阅是否应该被视为 API 密钥?

从技术上讲,您可以将订阅密钥视为 API 密钥,但这并不适用于所有场景。

默认情况下,创建API时需要订阅密钥才能访问API。

在少数数据较少的情况下,您可以使用订阅密钥作为 API 密钥,并且在此处的 MSDoc 中有更清晰的详细说明。

  • 订阅密钥应该由多个用户或后端共享吗?

从技术上讲,可以与一组用户或后端共享订阅密钥,但如果您尝试检索细粒度的用户级数据身份,则不建议这样做。

例如,如果您有一个被许多用户或后端应用程序使用的订阅密钥,则很难识别谁访问了什么以及哪个应用程序。

因此,为每个用户或后端分配唯一的订阅密钥可以更灵活地跟踪所需的数据。

如果您仍然想为多个用户或后端应用程序分配相同的订阅密钥,请确保您在每个用户的请求都具有的

JWT
令牌中实现唯一标识符或作为
query
参数。

  • 如何丰富 Application Insight 日志以包含其他信息?

要丰富 Application Insights 以添加其他详细信息,您可以首先配置 API 管理服务来验证 JWT 并提取用户声明。现在,将此信息进一步传递给 Application Insights。

注意:您可以使用<outbound>策略中的logging

trace
策略来发送和检索数据。

要验证

JWT
,请转到 APIM 并添加入站
validate-JWT
策略,方法是包含身份验证标头、声明以及开放 ID URL,如下所示。

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Not accessible">
    <openid-config url="https://login.microsoftonline.com/tenantID/v2.0/.well-known/openid-configuration" />
    <audiences>
        <audience>api://d172xxxxadcab</audience>
    </audiences>
    <required-claims>
        <claim name="aud" match="all">
            <value>d17229xxx71eadcab</value>
        </claim>
    </required-claims>
</validate-jwt>

此外,您还需要使用

set-variable
提取所需的用户声明(例如 userid)并将其添加到日志中以供检索。

发送日志完成后,您可以使用特定的查询相关语言相应地从 Application Insights 中查询数据。 (例如:KQL)

© www.soinside.com 2019 - 2024. All rights reserved.