Flazzo memiliki fokus utama untuk menambah nilai bisnis Anda.

Blog

Aplikasi multi-lokal dengan Keycloak Kingdoms

18294360-thumb.jpg
Blog

Aplikasi multi-lokal dengan Keycloak Kingdoms

[ad_1]

Perkenalan

Catatan: Anda dapat mengunduh sumber dari GitHub.

Saya telah mengerjakan aplikasi multi -lokal di .NET Ecosystem untuk beberapa waktu, dan salah satu tantangan paling sulit yang selalu saya temui adalah isolasi yang aman dari penyewa – terutama ketika pelanggan yang berbeda menunggu dasar -dasar, peran, dan kapasitas manajemen pengguna yang berbeda.

Solusi favorit saya untuk ini adalah Keycloak, alat open source dan akses. Dengan Keyycloak, saya mengandalkan kerajaan Untuk mengisolasi konfigurasi penyewa, lalu pasang semuanya dengan hati -hati dalam aplikasi .net saya. Begini caranya.

Mengapa Menggunakan Keycloak Realms?

Keycloak Realms memungkinkan Anda untuk membagi setiap penyewa menjadi “ruang “nya sendiri, dengan pengguna, grup, peran, dan pelanggan OAuth / OpenID Connect. Karena setiap kerajaan bekerja seperti silo, saya dapat mengintegrasikan klien baru (penyewa) hanya dengan memutar area baru – tidak diperlukan perubahan kode utama. Jauh lebih mudah daripada memaksa repertoar pengguna raksasa untuk mengelola semua orang di satu tempat.

Bagaimana itu cocok dengan .net

Dari sudut pandang ASP.NET, dunia menyederhanakan cara saya menyusun otentikasi mengalir. Setiap kerajaan dikaitkan dengan sendirinya pemancar (otoritas),, ClientIddan opsional Kerahasiaan Pelanggan. Semua yang harus saya lakukan dalam kode .NET saya adalah untuk menentukan penyewa mana permintaan, kemudian mengkonfigurasi pipa otentikasi untuk menunjuk ke kerajaan kanan.

Konfigurasi KeyClok: Kerajaan dan Pelanggan

Bayangkan bahwa saya memiliki dua penyewa: Tenant A dan Tenant B. Di Keycloak:

  1. Buat kerajaan “”Tenaa. “”
    • Di area ini, tambahkan pelanggan seperti admin_portal Atau distributor_portal.
  2. Buat kerajaan “”penyewa. “”
    • Pendekatan serupa: Buat pelanggan untuk setiap aplikasi terpisah.

Setiap area menjaga jejak direktori penggunanya sendiri. Jika administrator penyewa ingin menonaktifkan pengguna, ini dilakukan di Penyewa A Kingdom saja, meninggalkan Penyewa B utuh.

Buat kerajaan yang terisolasi

Buat kerajaan yang terisolasi

Pelanggan yang terisolasi untuk produk yang berbeda

Pelanggan yang terisolasi untuk produk yang berbeda

Mengapa begitu praktis?

Mengingat bahwa begitu kerajaan dan pelanggan dikonfigurasi, tugas harian untuk setiap penyewa dipartisi dengan cermat. Penyewa A Staf tidak dapat bermain dengan konfigurasi Tenant B dan sebaliknya.

Kabel di .net

Mendeteksi penyewa

Di sebagian besar proyek saya, saya mengandalkan sub-domain atau frontend Parameter untuk menentukan penyewa mana yang saat ini menyerang aplikasi – sebagai tenantA.myapp.com melawan tenantB.myapp.com. Jika sub-domain bukan pilihan, Anda dapat melewati header yang dipersonalisasi, menganalisis segmen jalur atau menyimpan pengidentifikasi penyewa dalam klaim JWT.

var host = context.Request.Host.Host; 
var tenant = host.Contains("tenantA") ? "tenantA" : "tenantB";

Penyimpanan Konfigurasi Kerajaan

Saya menyimpan kamus sederhana atau file json yang memetakan nama -nama penyewa dengan pengaturan Keycloak:

public static class MultiTenantAuthOptions
{
    public static Dictionary TenantSettings = new()
    {
        ["tenantA"] = new TenantConfig
        {
            RealmName = "tenantA",
            AuthorityUrl = "
            ClientId = "admin_portal",
            ClientSecret = "SECRET_A"
        },
        ["tenantB"] = new TenantConfig
        {
            RealmName = "tenantB",
            AuthorityUrl = "
            ClientId = "dist_portal",
            ClientSecret = "SECRET_B"
        }
    };
}

Dengan cara ini, aplikasi saya memilih hak AuthorityUrl Dan ClientId Pada saat eksekusi.

Acara Dukungan JWT yang Dipersonalisasi

Asp.net Core biasanya menggunakan konfigurasi statis untuk pembawa JWT. Tetapi dengan beberapa pakaian, saya menggantinya dengan cepat. Misalnya:

public class MultiTenantJwtBearerEvents : JwtBearerEvents
{
    public override Task MessageReceived(MessageReceivedContext context)
    {
        var host = context.Request.Host.Host;
        var tenantKey = host.Contains("tenantA") ? "tenantA" : "tenantB";

        if (MultiTenantAuthOptions.TenantSettings.TryGetValue(tenantKey, out var cfg))
        {
            context.Options.Authority = cfg.AuthorityUrl;
            context.Options.TokenValidationParameters.ValidAudience = cfg.ClientId;
        }

        return base.MessageReceived(context);
    }
}

Setelah itu, kode saya dapat mengelola koneksi dari kerajaan yang berbeda tanpa gesekan.

Administrator khusus untuk kerajaan

Konfigurasi Peran Administrasi

Keycloak memungkinkan Anda untuk memberikan setiap bidang pengguna administrasi sendiri. Saya menyukainya karena memberikan setiap kendali penyewa atas dasar penggunanya sendiri, peran dan aturan keselamatan – tanpa mempertaruhkan salib – konfusi penyewa. Langkahnya sederhana:

  1. Pergi ke Kelola> PenggunaBuat nama bernama, katakanlah, realmAdminA.
  2. Tetapkan peran seperti manage-users,, view-realmdan seterusnya, khususnya di bawah realm-management Pelanggan di daerah ini.
  3. Pengguna ini sekarang hanya dapat melakukan tugas administrasi di bidangnya.

Tindakan administrasi yang khas meliputi:

  • Nonaktifkan / Izinkan Pengguna
  • Reset Kata Sandi
  • Manajemen milik suatu kelompok
  • Verifikasi sesi pengguna dan perekaman pengguna
  • Konfigurasi persyaratan 2FA

Karena otorisasi administrasi ini dibawa ke satu area, administrator penyewa tidak dapat melihat atau memecah apa pun yang menjadi milik penyewa lain. Pemisahan ini justru apa yang dibutuhkan arsitektur multi-lokal.

Jurnalisasi dan sesi pengguna

Keycycloak mencatat semua jenis acara – menghubungkan, pemutusan, upaya yang tidak berhasil, reset kata sandi, dll. Ini sangat ideal untuk kepatuhan dan pemecahan masalah. Setiap administrator kerajaan dapat menampilkan koran yang relevan hanya untuk area ini.

Pengguna, untuk bagian mereka, dapat melihat sesi aktif mereka sendiri dan mengakhirinya jika perlu. Ini sederhana dan mempertahankan tanggung jawab yang terpecah dengan jelas.

Konfigurasikan apa yang diterima pendengar untuk acara kerajaan.

Konfigurasikan apa yang diterima pendengar untuk acara kerajaan.


Konfigurasikan acara pengguna apa yang harus terhubung untuk domain.

Konfigurasikan acara administrasi untuk terhubung ke kerajaan.

Konfigurasikan acara administrasi untuk terhubung ke kerajaan.

Acara adalah rekaman acara pengguna dan administrasi di bidang ini.

Acara adalah rekaman acara pengguna dan administrasi di bidang ini.

Sesi adalah sesi pengguna di bidang ini dan pelanggan yang mereka akses dalam sesi.

Sesi adalah sesi pengguna di bidang ini dan pelanggan yang mereka akses dalam sesi.

Migrasi pengguna yang ada

Jika Anda sudah menjalankan toko pengguna yang diwariskan, Anda mungkin ingin membawa data ini di KeyCyloak. Saya biasanya mempertimbangkan dua metode:

  1. Migrasi tepat pada waktunya (JIT)
    • Ketika pengguna terhubung untuk pertama kalinya, kode Anda memeriksa database lama, memvalidasi informasi identifikasi, kemudian membuat pengguna di KeyCycloak.
  2. Migrasi curah
    • Tulis skrip yang menarik semua rekaman dari pengguna sistem lama dan memanggil Keycloak API API REST untuk membuat pengguna ini.

Jika Anda memiliki kata sandi cincang dalam format non -standar, Anda mungkin memerlukan reset kata sandi paksa selama koneksi Keycloak pertama. Ini umumnya lebih aman daripada menyimpan teks dengan jelas atau bermain dengan hash yang dipersonalisasi.

Isolasi data di .net

Bahkan jika Keycloak Realms mendukung isolasi identitas, aplikasi .NET Anda harus selalu menghormati multi-ketegangan di lapisan data. Biasanya saya mengandalkan:

  • Diagram basis data terpisah atau saluran koneksi yang dipisahkan oleh penyewa
  • Layanan jangkauan yang menyuntikkan ID penyewa saat ini dan secara otomatis memfilter permintaan
  • Cache yang dipartisi Karena itu Anda tidak secara tidak sengaja melayani data yang dimasukkan ke dalam cache penyewa kepada penyewa b

Ini adalah pendekatan dua -layer: Keycloak tidak memastikan tumpang tindih identitas dan aplikasi Anda menjamin bahwa tidak ada data yang meluap.

Refleksi akhir dan praktik terbaik

Menurut pengalaman saya, implementasi kerajaan oleh penyewa menyederhanakan hampir semua masalah yang berkaitan dengan keamanan. Mudah untuk bernalar, mudah untuk menyerahkan administrasi parsial dan sederhana untuk menjalankan kerajaan baru saat Anda tumbuh. Beberapa tips pemisahan:

  • Mengotomatiskan penciptaan kerajaan: Manfaatkan Istirahat API Keycloak REST atau fitur impor / ekspor kerajaannya.
  • Pantau dengan cermat: Gunakan pengukuran keycloak terintegrasi atau alat eksternal (Prometheus, Grafana) untuk mengawasi kinerja, aktivitas koneksi, dan upaya brute force potensial.
  • Lihat Akun Kerajaan: Jika Anda mengharapkan ratusan atau ribuan penyewa, dengan hati -hati menimbang biaya umum – kadang -kadang kelompok penyewa yang lebih kecil dalam satu kerajaan diperlukan.

Dengan menggabungkan strategi Keyclok Realms ini dengan kode Awal-Aware .NET, saya membangun platform SaaS yang telah terukur dengan sempurna sambil menjaga basis pengguna dari setiap pelanggan yang terkunci. Jika Anda mencoba menyederhanakan manajemen identitas multi-lokal di .NET, Keycloak Realms mungkin menyimpan banyak kerumitan.

Referensi

  1. Dokumentasi KeyClok
  2. Otentikasi Inti ASP.NET
  3. Spesifikasi Koneksi OpenID

[ad_2]