Mencatat panggilan API di bawah kredensial AAD

Saya memiliki banyak API yang berjalan di Azure di belakang APIM yang memerlukan otentikasi OIDC oleh AAD saya dan semuanya berfungsi seperti yang diharapkan, tetapi saya bertanya-tanya apa cara terbaik untuk memantau/mencatat pengguna mana yang memanggil API mana. Informasi tersebut tersedia di JWT yang dihasilkan oleh layanan OIDC dari APIM jadi saya berharap hal itu dapat dilakukan.

Layanan APIM default, Analytics, mencatat beberapa informasi dasar misalnya, tanpa melakukan sesuatu yang khusus, setiap panggilan dicatat di bawah pengguna "Anonim" dengan id pengguna yang dibuat secara acak (persisten?).

Saya dapat membuat sekelompok Pengguna APIM dan membagikan kunci langganan yang sesuai kepada Pengguna AAD saya dan menambahkan kunci ke header mereka saat membuat permintaan. Dengan ini, panggilan-panggilan tersebut dicatat dengan nama mereka dan itulah yang saya inginkan. Masalahnya adalah hal ini tampaknya tidak terlalu aman. Apa yang mencegah pembagian kunci langganan dan/atau ketidakcocokan antara kredensial Pengguna AAD dan kunci langganan APIM?

Apa cara yang tepat untuk melakukan ini? Bisakah ini dilakukan dari dalam APIM/AAD atau apakah saya perlu menggunakan sesuatu seperti Event Hubs?

Sunting:

Saya menemukan solusi yang berhasil. Dengan mengaktifkan Application Insights, kebijakan API masuk berikut menyimpan bidang nama token JWT sebagai pelacakan.

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

Mungkin saya juga harus menambahkan kebijakan jika JWT tidak berisi nama bidang dan menolak panggilan API (mungkin permintaan buruk).

Bagaimanapun, ini terdengar seperti sebuah cara namun bukan solusi yang tepat dan sepertinya bukan masalah yang unik.


person Jurgy    schedule 29.10.2019    source sumber
comment
Bisakah Anda menambahkan solusi Anda sebagai jawabannya?   -  person Tony Ju    schedule 31.10.2019
comment
Apakah ini solusinya. Maksudku, ini berhasil, tapi mungkin tidak terlalu bersih.   -  person Jurgy    schedule 31.10.2019


Jawaban (1)


Anda benar bahwa hal itu tidak mungkin terjadi di luar kotak. Ada dua solusi yang bisa saya lihat:

  1. Yang Anda temukan. Yaitu. keluarkan informasi tambahan ke dalam log AppInsights dan gunakan untuk melihat pengguna.
  2. Solusi "tidak bersih" yang kedua adalah memasukkan informasi tambahan itu ke dalam header yang akan dikirim ke backend Anda. Kami tidak memerlukan backend untuk melakukan apa pun dengannya, sebagai gantinya Anda dapat menyiapkan pengelogan Azure Monitor untuk mencatat header tambahan ini bersama dengan setiap permintaan. Lalu parsing log Azure Monitor (mungkin dengan Log Analytics) untuk mendapatkan informasi yang Anda inginkan.
person Vitaliy Kurokhtin    schedule 08.11.2019