Dukungan untuk token jwt anonim di IdentityServer4 menggunakan AnonymousIdentity


Baru-baru ini, saya perlu menerapkan dukungan untuk otentikasi pengguna anonim berdasarkan OpenId Connect dan OAuth 2.0 pada platform ASP.NET Core. Spesifikasi protokol ini tidak akan dijelaskan di sini, untuk ini ada artikel lengkap tentang Habr. Mari kita langsung ke intinya.


Mengapa kita membutuhkan token anonim? Untuk memberi otorisasi kepada pengguna anonim pada sumber daya API, terutama dalam arsitektur layanan mikro, di samping itu, ia dapat mengubah keadaan aplikasi kami, misalnya, Vasya menyukai kaus dengan kucing, ia menambahkannya ke keranjang toko online dan, mungkin, memesan sebagai tamu. Untuk memahami bahwa itu Mudah, token anonim berisi pengidentifikasi pengguna anonim dan pengidentifikasi sesi. Ketika dengan mudah masuk, parameter ini akan dimasukkan dalam token yang diautentikasi.


Selain itu, token akses anonim dapat berisi pernyataan (atau klaim) tambahan.


Alat-alatnya



Implementasi


IdentityServer4 memiliki banyak contoh di GitHub.


Menambahkan dukungan untuk token anonim cukup sederhana:


  • Instal AnonymousIdentity dalam sebuah proyek dengan IdneitityServer4
    Install-Package AnonymousIdentity 
  • Daftarkan AnonymousIdentity di Startup.cs
     services.AddIdentityServer() //   .AddAnonymousAuthentication(); 

Skenario interaksi


Pertimbangkan untuk mendapatkan token anonim untuk Aliran Implisit dan Alur Kode Otorisasi .


Permintaan Poin Otorisasi


Untuk mengikuti spesifikasi, permintaan untuk titik otorisasi untuk Aliran Implisit adalah sebagai berikut.


 GET /connect/authorize? client_id=client1& scope=openid email api1& response_type=id_token token& redirect_uri=https://myapp/callback& state=abc& nonce=xyz& acr_values=0& response_mode=json 

Untuk Aliran Kode Otorisasi, permintaan serupa dengan response_type = kode (PKCE adalah opsional).


Perbedaan antara permintaan reguler dan anonim dalam dua parameter:


  • Acr_values ​​= 0 parameter menandakan login anonim. Jika tertarik, Anda dapat membaca spesifikasi OpenId Connect .
  • Response_mode = parameter json digunakan untuk merespons dalam bentuk Json tanpa pengalihan yang tidak perlu.

Menerima token


Bergantung pada status otentikasi, token anonim atau dikonfirmasi dikembalikan.


Aliran tersirat


Dalam hal ini, titik otorisasi merespons dalam bentuk Json, termasuk token akses.


 { "id_token": <id_token>, "access_token": <access_token>, "token_type": "Bearer", "expires_in": "2592000", "scope": "openid email api1", "state": "abc", "session_state": <optional> } 

Alur Kode Otorisasi


Dengan pendekatan ini, titik otorisasi merespons dalam bentuk Json, termasuk kode otorisasi.


 { "code": <authorization_code>, "scope": "openid email api1", "state": "abc", "session_state": <optional> } 

Kemudian, Anda perlu menukar kode untuk token menggunakan metode standar.


Kami membentuk permintaan ke titik akhir token.


 POST /connect/token client_id=client2& client_secret=secret& grant_type=authorization_code& code=`& redirect_uri=https://myapp/callback 

Akibatnya, titik akhir token merespons dalam bentuk Json, termasuk token akses.


 { "id_token": <id_token>, "access_token": <access_token>, "token_type": "Bearer", "expires_in": "2592000", "scope": "openid email api1" } 

Membandingkan token anonim dan dikonfirmasi


Jika server otorisasi tidak berisi data otentikasi, kami mendapatkan token anonim.


 { "nbf": 1566849147, "exp": 1569441147, "iss": "https://server", "aud": [ "https://server/resources", "api" ], "client_id": "client1", "sub": "abda9006-5991-4c90-a88c-c96764027347", "auth_time": 1566849147, "idp": "local", "ssid": "9e6453dbaf5ffdb03f08812f759d3cdf", "scope": [ "openid", "email", "api1" ], "amr": [ "anon" ] } 

Anda dapat menentukan bahwa pengguna anonim menggunakan metode otentikasi (amr).
Pengidentifikasi sesi "umum" (ssid) dan pengidentifikasi subjek (sub) akan dimasukkan dalam token yang diautentikasi, pada login pengguna berikutnya.


Jika pengguna masuk, kami mendapatkan token yang diautentikasi.


 { "nbf": 1566850295, "exp": 1566853895, "iss": "https://server", "aud": [ "https://server/resources", "api" ], "client_id": "client1", "sub": "bob", "auth_time": 1566850295, "idp": "local", "aid": "abda9006-5991-4c90-a88c-c96764027347", "ssid": "9e6453dbaf5ffdb03f08812f759d3cdf", "scope": [ "openid", "email", "api1" ], "amr": [ "pwd" ] } 

Seperti yang Anda lihat, pengidentifikasi pengguna anonim (bantuan) cocok dengan sub token anonim, seperti halnya ssid. Jika klien tidak melakukan login anonim, maka token yang diautentikasi hanya akan berisi ssid.


Dengan demikian, kami dapat mengotorisasi pengguna anonim dan mengidentifikasi tindakannya setelah memasuki sistem.


Kesimpulan


Dalam artikel ini, kami memeriksa skenario untuk memperoleh token anonim / dikonfirmasi menggunakan IdentityServer4 dengan ekstensi AnonymousIdentity .


Jika Anda memiliki pertanyaan, saya akan dengan senang hati menjawabnya di komentar.

Source: https://habr.com/ru/post/id466467/


All Articles