Asp.net Active Directory帐户在第一次尝试时锁定

Asp.net Active Directory帐户在第一次尝试时锁定,asp.net,active-directory,directoryservices,Asp.net,Active Directory,Directoryservices,我有一个网站,要求用户输入他们的公司网络用户名和密码。然后,它在Active Directory中查找该帐户,并获取与该帐户关联的所有电子邮件地址的列表 我遇到的问题是,一个错误的密码锁定了一个帐户。我们的域策略是,一个帐户在三次输入错误后将被锁定,因此我假设我的代码中有错误。一般来说,我对Active Directory或.NET DirectoryServices不是很了解,从我的代码中可以明显看出这一点。这是: public ArrayList AuthenticateActiveDire

我有一个网站,要求用户输入他们的公司网络用户名和密码。然后,它在Active Directory中查找该帐户,并获取与该帐户关联的所有电子邮件地址的列表

我遇到的问题是,一个错误的密码锁定了一个帐户。我们的域策略是,一个帐户在三次输入错误后将被锁定,因此我假设我的代码中有错误。一般来说,我对Active Directory或.NET DirectoryServices不是很了解,从我的代码中可以明显看出这一点。这是:

public ArrayList AuthenticateActiveDirectory(string Domain, string UserName, string Password)
{
    // An error occurs if the username/password combo does not exist.
    // That is how we know it is not a valid entry.
    try
    {
        DirectoryEntry entry = new DirectoryEntry("LDAP://" + Domain, UserName, Password);
        object nativeObject = entry.NativeObject;
        ArrayList emails = new ArrayList();
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.Filter = "samaccountname=" + UserName;
        ds.PropertiesToLoad.Add("mail");
        SearchResult sr = ds.FindOne();
        if (sr.Properties["mail"] != null)
        {
            for (int email = 0; email < sr.Properties["mail"].Count; email++)
            {
                emails.Add(sr.Properties["mail"][email]);
            }
        }
        return emails;
    }
    catch (DirectoryServicesCOMException) { throw; }
    catch (Exception) { throw; }
}
public ArrayList AuthenticateActiveDirectory(字符串域、字符串用户名、字符串密码)
{
//如果用户名/密码组合不存在,则会发生错误。
//这就是我们知道它不是有效条目的原因。
尝试
{
DirectoryEntry=新的DirectoryEntry(“LDAP://”+域、用户名、密码);
object nativeObject=entry.nativeObject;
ArrayList电子邮件=新建ArrayList();
DirectorySearcher ds=新的DirectorySearcher(条目);
ds.Filter=“samaccountname=”+用户名;
ds.PropertiesToLoad.Add(“邮件”);
SearchResult sr=ds.FindOne();
if(sr.Properties[“邮件”!=null)
{
对于(int email=0;email
我进行了一些搜索,找到了一些代码(感谢您提供的解决方案),可以使用这些代码进行身份验证,而不搜索电子邮件或其他任何内容。我在使用其他函数之前先使用这个函数,它似乎工作得很好。我猜我的另一个代码不止一次——至少三次——击中了广告,这导致了锁定。下面是我现在用来进行身份验证的代码:

    private bool Authenticate(string domain, string user, string password)
{
    try
    {
        using (DirectoryEntry de = new DirectoryEntry("LDAP://" + domain,
                                              user, password))
        {
            return de.NativeObject != null;
        }
    }
    catch
    {
        return false;
    }
}

与你的问题无关,但是
catch(Exception){throw;}
到底有什么意义呢?没什么:)如果我认为我可能需要在那里做额外的处理,我有时会把它放进去。我在调试时也会用到它,它作为一个额外的提醒,提醒这里可能会发生这些异常。顺便说一句,密码重试的一般经验法则是将它增加到10左右。这是因为各种windows组件在最后发出“拒绝访问”消息之前都会默默地重试几次,这是出了名的。这也不是真正的安全性下降,因为它几乎不可能在10次尝试中猜到密码,因为它是3次。此外,如此小的限制可能导致非常成功的DOS攻击,攻击者只是试图阻止其他人登录。谢谢,但这不是我的要求。我认为我们的网络管理员不会同意这一点。关于DOS攻击:此站点仅为内部站点。