验证密码是否正确

时间:2010-10-14 15:30:56

标签: c# asp.net active-directory passwords directoryentry

我需要验证用户的密码是否正确。

我有这段代码:

 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);
            }

但这只是获取名称并且不验证密码。

请帮忙。感谢

2 个答案:

答案 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)

您可以使用DirectoryEntry本身。

请参阅此处的示例:http://support.microsoft.com/kb/316748

你为什么要使用WinNT://无论如何?