Bagaimana saya bisa memvalidasi nama pengguna dan kata sandi terhadap Active Directory? Saya hanya ingin memeriksa apakah nama pengguna dan kata sandi sudah benar.
526
Bagaimana saya bisa memvalidasi nama pengguna dan kata sandi terhadap Active Directory? Saya hanya ingin memeriksa apakah nama pengguna dan kata sandi sudah benar.
Jika Anda bekerja dengan .NET 3.5 atau yang lebih baru, Anda bisa menggunakan System.DirectoryServices.AccountManagement
namespace dan dengan mudah memverifikasi kredensial Anda:
// create a "principal context" - e.g. your domain (could be machine, too)
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
// validate the credentials
bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}
Sederhana, dapat diandalkan, 100% kode dikelola # C di ujung Anda - apa lagi yang bisa Anda minta? :-)
Baca semua tentang ini di sini:
Memperbarui:
Sebagaimana diuraikan dalam pertanyaan SO lainnya ini (dan jawabannya) , ada masalah dengan panggilan ini yang mungkin mengembalikan True
kata sandi lama pengguna. Berhati-hatilah dengan perilaku ini dan jangan terlalu terkejut jika ini terjadi :-) (terima kasih kepada @MikeGledhill karena telah menunjukkan ini!)
UserPrinciple.FindByIdentity
untuk melihat apakah ID pengguna yang lulus ada terlebih dahulu.ContextOptions.Negotiate
.Kami melakukan ini di Intranet kami
Anda harus menggunakan System.DirectoryServices;
Berikut adalah nyali kode
sumber
strPassword
disimpan dalam LDAP dalam teks biasa?Close()
padausing
variabel.Beberapa solusi yang disajikan di sini tidak memiliki kemampuan untuk membedakan antara pengguna / kata sandi yang salah, dan kata sandi yang perlu diubah. Itu bisa dilakukan dengan cara berikut:
Jika kata sandi pengguna salah, atau pengguna tidak ada, kesalahan akan berisi
"8009030C: LdapErr: DSID-0C0904DC, komentar: Kesalahan acceptSecurityContext, data 52e, v1db1",
jika kata sandi pengguna perlu diubah, itu akan berisi
"8009030C: LdapErr: DSID-0C0904DC, komentar: Kesalahan acceptSecurityContext, data 773, v1db1"
Nilai
lexc.ServerErrorMessage
data adalah representasi hex Kode Kesalahan Win32. Ini adalah kode kesalahan yang sama yang akan dikembalikan dengan cara memanggil panggilan API LogonUser Win32. Daftar di bawah ini merangkum berbagai nilai umum dengan nilai hex dan desimal:sumber
System.DirectoryServices
danSystem.DirectoryServices.Protocols
solusi yang sangat sederhana menggunakan DirectoryServices:
akses NativeObject diperlukan untuk mendeteksi pengguna / kata sandi yang buruk
sumber
PrincipleContext
- yang hanya ada di .NET 3.5. Tetapi jika Anda menggunakan .NET 3.5 atau yang lebih baru, Anda harus menggunakanPrincipleContext
Sayangnya tidak ada cara "sederhana" untuk memeriksa kredensial pengguna pada AD.
Dengan setiap metode yang disajikan sejauh ini, Anda mungkin mendapatkan false-negative: Kredit pengguna akan valid, namun AD akan mengembalikan false dalam keadaan tertentu:
ActiveDirectory tidak akan mengizinkan Anda menggunakan LDAP untuk menentukan apakah kata sandi tidak valid karena fakta bahwa pengguna harus mengubah kata sandi atau jika kata sandi mereka telah kedaluwarsa.
Untuk menentukan perubahan kata sandi atau kata sandi kedaluwarsa, Anda dapat menghubungi Win32: LogonUser (), dan memeriksa kode kesalahan windows untuk 2 konstanta berikut:
sumber
Cara termudah adalah dengan PInvoke LogonUser Win32 API.eg
Referensi MSDN di sini ...
Pasti ingin menggunakan tipe masuk
Ini membuat token yang ringan saja - sempurna untuk pemeriksaan AuthN. (tipe lain dapat digunakan untuk membuat sesi interaktif, dll.)
sumber
LogonUser
API mengharuskan pengguna untuk memiliki Bertindak sebagai bagian dari sistem operasi privelage; yang bukan sesuatu yang didapat pengguna - dan bukan sesuatu yang ingin Anda berikan kepada setiap pengguna dalam organisasi. ( msdn.microsoft.com/en-us/library/aa378184(v=vs.85).aspx )Solusi .Net penuh adalah dengan menggunakan kelas-kelas dari namespace System.DirectoryServices. Mereka memungkinkan untuk meminta server AD secara langsung. Berikut adalah contoh kecil yang akan melakukan ini:
Kode ini langsung terhubung ke server AD, menggunakan kredensial yang disediakan. Jika kredensial tidak valid, searcher.FindOne () akan melempar pengecualian. ErrorCode adalah yang sesuai dengan kesalahan COM "kesalahan nama pengguna / kata sandi".
Anda tidak perlu menjalankan kode sebagai pengguna AD. Bahkan, saya berhasil menggunakannya untuk menanyakan informasi pada server AD, dari klien di luar domain!
sumber
Namun .NET call lain untuk mengautentikasi kredensial LDAP dengan cepat:
sumber
Coba kode ini (CATATAN: Dilaporkan tidak berfungsi di windows server 2000)
kecuali Anda harus membuat pengecualian khusus untuk "LogonException"
sumber
Jika Anda terjebak dengan .NET 2.0 dan kode terkelola, berikut adalah cara lain yang berfungsi dengan akun lokal dan domain:
sumber
Otentikasi Windows dapat gagal karena berbagai alasan: nama pengguna atau kata sandi salah, akun terkunci, kata sandi kedaluwarsa, dan banyak lagi. Untuk membedakan antara kesalahan ini, panggil fungsi LogonUser API melalui P / Invoke dan periksa kode kesalahan jika fungsinya kembali
false
:Penggunaan sampel:
Catatan: LogonUser membutuhkan hubungan kepercayaan dengan domain yang Anda validasi.
sumber
Fungsi Sederhana Saya
sumber
Di sini solusi otentikasi lengkap saya untuk referensi Anda.
Pertama, tambahkan empat referensi berikut
sumber