2010-07-06 2 views
1

У меня есть веб-сайт, который требует, чтобы пользователи вводили имя и пароль своей корпоративной сети. Затем он ищет эту учетную запись в Active Directory и получает список любых адресов электронной почты, связанных с этой учетной записью.Аккаунт 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; } 
} 
+0

Не имеет отношения к вашему вопросу, но что в мире является точкой 'catch (Exception) {throw; } '? –

+0

Ничего :) Я иногда добавляю это, если думаю, что мне, возможно, понадобится дополнительная обработка. Я также использую его при отладке, и он служит дополнительным напоминанием о том, что эти исключения могут произойти здесь. – MJB

ответ

0

Я сделал некоторые поиски и нашел некоторый код (спасибо Ayende Rahien для решения), чтобы использовать, что только подтверждает подлинность и не искать сообщения электронной почты или что-нибудь еще. Я использую это до другой функции, и, похоже, она работает нормально. Я предполагаю, что мой другой код поражает AD более одного раза - по крайней мере 3 раза - что приводит к блокировке. Вот код, который я использую сейчас, чтобы просто подтвердить подлинность:

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; 
    } 
} 
+1

В качестве побочного примечания общее правило для повторных попыток пароля - увеличить его до 10 или около того. Это связано с тем, что различные компоненты Windows печально известны для повторной попытки повторного запуска несколько раз, прежде чем, наконец, дать сообщение «Отказано в доступе». Это также не является реальной деградацией безопасности, так как почти так же вряд ли угадать пароль в 10 попытках, как и в случае 3. Кроме того, такой небольшой предел может привести к очень успешным атакам DOS, когда злоумышленник просто пытается предотвратить другие записи in – NotMe

+0

Спасибо, но это не мой звонок. Я не думаю, что наш Администратор Сети согласится на это. Что касается атак DOS: этот сайт является только внутренним. – MJB

Смежные вопросы