我需要验证用户的密码是否正确。
我有这段代码:
private bool checkOldPasswordValid(string password, string username)
{
using (DirectoryEntry entry = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"))
{
entry.Username = username;
entry.Password = password;
DirectorySearcher searcher = new DirectorySearcher(entry);
searcher.Filter = "(objectclass=user)";
try
{
searcher.FindOne();
}
catch (Exception ex)
{
return false;
}
return true;
}
}
但是WinNt不支持目录搜索器,所以我找到了另一种循环遍历所有记录的方法。
foreach (DirectoryEntry dc in entry.Children)
{
// prints the name
System.Diagnostics.Debug.WriteLine(dc.Name);
}
但这只是获取名称并且不验证密码。
请帮忙。感谢
答案 0 :(得分:3)
要对LDAP或WinNT进行身份验证,您不需要DirectorySearcher
。您只需从NativeObject
实例获取DirectoryEntry
即可。这是一个可能引导您完成整个过程的代码示例。
public bool Authenticate(string username, string password, string domain) {
bool authenticated = false;
using (DirectoryEntry entry = new DirectoryEntry(@"WinNT://" + domain, username, password) {
try {
object nativeObject = entry.NativeObject;
authenticated = true;
} catch (DirectoryServicesCOMException ex) {
}
}
return authenticated;
}
此代码将返回用户是否可信。一旦使用此DirectoryEntry
类实例获取NativeObject属性,这意味着AD(或本地计算机)使用模拟来获取此对象。如果您在没有抛出异常的情况下获得该对象,则意味着AD(或本地计算机)能够对该模拟用户进行身份验证。
虽然您可以通过指定用户名和密码来指定当前经过身份验证的用户,但只指定域(或本地计算机),但是您说要使用模拟,因此安全基础结构将使用给定用户名和密码以尝试从此NativeObject
类实例中检索DirectoryEntry
属性。
要针对AD进行身份验证,只需替换"WinNT://"
的{{1}}。
答案 1 :(得分:2)