在AAD凭据下记录API调用

时间:2019-10-29 08:18:02

标签: azure logging azure-active-directory azure-api-management apim

我在Azure的APIM后面有很多正在运行的API,这些API需要通过我的AAD进行OIDC身份验证,并且一切正常,但是我想知道监视/记录哪个用户调用哪个API的最佳方法是什么。该信息在APIM的OIDC服务生成的JWT中可用,因此我希望它是可能的。

例如,默认的APIM服务Analytics(分析)会记录一些基本信息,而无需执行任何特殊操作,每个调用都会记录在用户“ Anonymous”下,并带有一个随机生成的(持续的)用户ID。

我可以创建一堆APIM用户并将相应的订阅密钥分发给我的AAD用户,并在发出请求时将密钥添加到其标头中。这样,这些呼叫将以他们的名字记录下来,而这正是我想要的。问题在于它似乎并不特别安全。是什么阻止订阅密钥的共享和/或AAD用户凭据与APIM订阅密钥之间的不匹配?

执行此操作的正确方法是什么?可以在APIM / AAD中完成此操作,还是需要使用事件中心之类的东西?

编辑:

我找到了一种可行的解决方案。通过启用Application Insights,以下入站API策略将JWT令牌的名称字段存储为跟踪。

X = ['sequence, A, 1, 2, 3', 
     'sequence, B, 10, 20, 30', 
     'sequence, C, 100, 200, 300']

Y = ['VEQ','1','map','2','cap',]

my_list = []

for x in map(lambda x: str.split(x, ','), X):
    retval = Y[:]
    retval[2] = x[1]
    retval[4] = x[2]
    my_list.append(retval)

如果JWT不包含字段名称并且拒绝API调用(也许是错误的请求),也许我还应该添加一个策略。

无论如何,这听起来像是 a 的方式,但却不是看起来像一个独特问题的正确解决方案。

1 个答案:

答案 0 :(得分:0)

您是对的,不可能开箱即用。我可以看到两种解决方案:

  1. 您找到的那个。即将额外的信息输出到AppInsights日志中,并使用它们来调查用户。
  2. 第二种“不干净的”解决方案是将多余的信息注入将发送到您的后端的标头中。但是,我们不需要后端执行任何操作,而是可以设置Azure Monitor日志记录,以将这个额外的标头与每个请求一起记录。然后解析Azure Monitor日志(可能使用Log Analytics)以获取所需的信息。