Etki alanı denetleyicisine göre bir dizi kimlik bilgisini doğrulamak istiyorum. Örneğin:
Username: STACKOVERFLOW\joel
Password: splotchy
Yöntem 1. Kimliğe Bürünme ile Active Directory'yi Sorgulama
Birçok kişi bir şey için Active Directory'yi sorgulamanızı önerir. Bir istisna atılırsa, bu yığın akışı sorusunda önerildiği gibi kimlik bilgilerinin geçerli olmadığını anlarsınız .
Ancak bu yaklaşımın bazı ciddi dezavantajları vardır :
Yalnızca bir etki alanı hesabının kimliğini doğrulamıyorsunuz, aynı zamanda örtük bir yetkilendirme kontrolü de yapıyorsunuz. Yani, kimliğe bürünme belirteci kullanarak AD'deki özellikleri okuyorsunuz. Aksi halde geçerli olan hesabın AD'den okuma hakkı yoksa ne olur? Varsayılan olarak tüm kullanıcıların okuma erişimi vardır, ancak etki alanı politikaları, kısıtlanmış hesaplar (ve veya gruplar) için erişim izinlerini devre dışı bırakacak şekilde ayarlanabilir.
AD'ye bağlanmanın ciddi bir ek yükü vardır, AD şeması önbelleğinin istemcide yüklenmesi gerekir (DirectoryServices tarafından kullanılan ADSI sağlayıcısındaki ADSI önbelleği). Bu hem ağ hem de AD sunucusu, kaynak tüketir ve bir kullanıcı hesabının kimlik doğrulaması gibi basit bir işlem için çok pahalıdır.
İstisnai olmayan bir durum için bir istisna hatasına güveniyorsunuz ve bunun geçersiz kullanıcı adı ve şifre anlamına geldiğini varsayıyorsunuz. Diğer sorunlar (ör. Ağ hatası, AD bağlantı hatası, bellek ayırma hatası, vb.) Daha sonra kimlik doğrulama hatası olarak yanlış yorumlanır.
Yöntem 2. LogonUser Win32 API
DiğerleriLogonUser()
API işlevini kullanmayı önerdi . Kulağa hoş geliyor, ancak ne yazık ki arayan kullanıcının bazen yalnızca işletim sistemine verilen bir izne ihtiyacı var:
LogonUser'ı çağıran işlem SE_TCB_NAME ayrıcalığını gerektirir. Çağıran işlem bu ayrıcalığa sahip değilse, LogonUser başarısız olur ve GetLastError ERROR_PRIVILEGE_NOT_HELD döndürür.
Bazı durumlarda, LogonUser'ı çağıran işlemin SE_CHANGE_NOTIFY_NAME ayrıcalığının da etkinleştirilmiş olması gerekir; aksi halde LogonUser başarısız olur ve GetLastError ERROR_ACCESS_DENIED döndürür. Bu ayrıcalık, yerel sistem hesabı veya yöneticiler grubunun üyesi olan hesaplar için gerekli değildir. Varsayılan olarak, SE_CHANGE_NOTIFY_NAME tüm kullanıcılar için etkindir, ancak bazı yöneticiler bunu herkes için devre dışı bırakabilir.
"Dışarı Asma işletim sisteminin bir parçası olarak Yasası " ayrıcalık sen ister istemez yapmak istediğim bir şey değildir - Microsoft işaret ettiği gibi bilgi bankası makalesinde :
... LogonUser'ı çağıran işlem SE_TCB_NAME ayrıcalığına sahip olmalıdır (Kullanıcı Yöneticisi'nde bu, " İşletim Sisteminin bir parçası olarak hareket et " hakkıdır). SE_TCB_NAME ayrıcalığı çok güçlüdür ve herhangi bir rastgele kullanıcıya, kimlik bilgilerini doğrulaması gereken bir uygulamayı çalıştırabilmeleri için verilmemelidir .
Ayrıca, LogonUser()
boş bir parola belirlenirse bir çağrı başarısız olacaktır.
Bir dizi etki alanı kimlik bilgisini doğrulamanın doğru yolu nedir?
Ben ne yönetilen koddan araman için, ancak bu aa genel, Windows sorudur. Müşterilerin .NET Framework 2.0'ın yüklü olduğu varsayılabilir.