Ведение журнала вызовов API под учетными данными AAD

У меня есть несколько API, работающих в Azure за APIM, которые требуют проверки подлинности OIDC с помощью моего AAD, и все работает так, как ожидалось, но мне интересно, как лучше всего отслеживать / регистрировать, какой пользователь вызывает какой API. Информация доступна в JWT, созданном службой OIDC APIM, поэтому я ожидал, что это возможно.

Служба аналитики APIM по умолчанию регистрирует некоторую базовую информацию, например, не делая ничего особенного, каждый вызов регистрируется под пользователем «Анонимный» со случайно сгенерированным (постоянным?) Идентификатором пользователя.

Я могу создать группу пользователей APIM и раздать соответствующие ключи подписки моим пользователям AAD и добавить ключи в их заголовки при выполнении запроса. При этом звонки записываются под своими именами, что мне и хотелось бы. Проблема в том, что это не кажется особенно безопасным. Что предотвращает совместное использование ключей подписки и / или несоответствие между учетными данными пользователя AAD и ключом подписки APIM?

Как правильно это сделать? Можно ли это сделать из APIM / AAD или мне нужно использовать что-то вроде концентраторов событий?

Редактировать:

Я нашел решение, которое вроде работает. При включении Application Insights следующая политика входящего API сохраняет поле имени токена JWT в виде трассировки.

<trace source="MyApi" severity="information">
    <message>@(context.Request.Headers.GetValueOrDefault("Authorization","No auth header").AsJwt()?.Claims.GetValueOrDefault("name", "No name field"))</message>
</trace>

Возможно, мне также следует добавить политику, если JWT не содержит имени поля и откажется от вызова API (возможно, неправильный запрос).

В любом случае, это звучит как , но не подходящее решение, которое не похоже на решение уникальной проблемы.


person Jurgy    schedule 29.10.2019    source источник
comment
Можете ли вы добавить свое решение в качестве ответа?   -  person Tony Ju    schedule 31.10.2019
comment
Но есть ли это решение? Я имею в виду, это работает, но, возможно, не совсем чистый.   -  person Jurgy    schedule 31.10.2019


Ответы (1)


Вы правы, что из коробки это невозможно. Я вижу два решения:

  1. Тот, который вы нашли. Т.е. выводить дополнительную информацию в журнал AppInsights и использовать ее для изучения пользователей.
  2. Второе «не чистое» решение - надуть эту дополнительную информацию в заголовок, который будет отправлен на ваш сервер. Однако нам не нужен бэкэнд, чтобы что-то с ним делать, вместо этого вы можете настроить ведение журнала Azure Monitor, чтобы регистрировать этот дополнительный заголовок вместе с каждым запросом. А затем проанализируйте журналы Azure Monitor (возможно, с помощью Log Analytics), чтобы получить нужную информацию.
person Vitaliy Kurokhtin    schedule 08.11.2019