Saya ingin memvalidasi sekumpulan kredensial terhadap pengontrol domain. misalnya:
Username: STACKOVERFLOW\joel
Password: splotchy
Metode 1. Permintaan Direktori Aktif dengan Peniruan Identitas
Banyak orang menyarankan untuk menanyakan sesuatu di Active Directory. Jika pengecualian dilempar, Anda tahu bahwa kredensial tersebut tidak valid - seperti yang disarankan dalam pertanyaan stackoverflow ini .
Namun ada beberapa kelemahan serius dari pendekatan ini :
Anda tidak hanya mengautentikasi akun domain, tetapi Anda juga melakukan pemeriksaan otorisasi implisit. Artinya, Anda membaca properti dari AD menggunakan token peniruan. Bagaimana jika akun yang valid tidak memiliki hak untuk membaca dari AD? Secara default, semua pengguna memiliki akses baca, tetapi kebijakan domain dapat disetel untuk menonaktifkan izin akses untuk akun (dan atau grup) yang dibatasi.
Mengikat terhadap AD memiliki overhead yang serius, cache skema AD harus dimuat di klien (cache ADSI di penyedia ADSI yang digunakan oleh DirectoryServices). Ini adalah jaringan, dan server AD, memakan sumber daya - dan terlalu mahal untuk operasi sederhana seperti mengautentikasi akun pengguna.
Anda mengandalkan kegagalan pengecualian untuk kasus yang tidak luar biasa, dan menganggap itu berarti nama pengguna dan kata sandi tidak valid. Masalah lain (misalnya kegagalan jaringan, kegagalan konektivitas AD, kesalahan alokasi memori, dll) kemudian disalahartikan sebagai kegagalan otentikasi.
Metode 2. LogonUser Win32 API
Orang lain menyarankan menggunakan LogonUser()
fungsi API. Kedengarannya bagus, tapi sayangnya pengguna yang menelepon terkadang membutuhkan izin yang biasanya hanya diberikan ke sistem operasi itu sendiri:
Proses memanggil LogonUser membutuhkan hak istimewa SE_TCB_NAME. Jika proses panggilan tidak memiliki hak istimewa ini, LogonUser gagal dan GetLastError mengembalikan ERROR_PRIVILEGE_NOT_HELD.
Dalam beberapa kasus, proses yang memanggil LogonUser juga harus mengaktifkan hak istimewa SE_CHANGE_NOTIFY_NAME; jika tidak, LogonUser gagal dan GetLastError mengembalikan ERROR_ACCESS_DENIED. Hak istimewa ini tidak diperlukan untuk akun sistem lokal atau akun yang menjadi anggota grup administrator. Secara default, SE_CHANGE_NOTIFY_NAME diaktifkan untuk semua pengguna, tetapi beberapa administrator dapat menonaktifkannya untuk semua orang.
Membagikan hak istimewa " Bertindak sebagai bagian dari sistem operasi " bukanlah sesuatu yang ingin Anda lakukan mau tak mau - seperti yang ditunjukkan Microsoft dalam artikel basis pengetahuan :
... proses yang memanggil LogonUser harus memiliki hak istimewa SE_TCB_NAME (di Pengelola Pengguna, ini adalah hak " Bertindak sebagai bagian dari Sistem Operasi "). Hak istimewa SE_TCB_NAME sangat kuat dan tidak boleh diberikan kepada sembarang pengguna hanya agar mereka dapat menjalankan aplikasi yang perlu memvalidasi kredensial.
Selain itu, panggilan ke LogonUser()
akan gagal jika kata sandi kosong ditentukan.
Apa cara yang tepat untuk mengautentikasi sekumpulan kredensial domain?
Saya kebetulan menelepon dari kode yang dikelola, tetapi ini adalah pertanyaan umum Windows. Dapat diasumsikan bahwa pelanggan telah menginstal .NETFramework 2.0.