2010-07-06 6 views
1

J'ai un site Web qui oblige les utilisateurs à entrer le nom d'utilisateur et le mot de passe de leur réseau d'entreprise. Il recherche ensuite ce compte dans Active Directory et obtient une liste des adresses e-mail associées à ce compte. Le problème que je rencontre est que UN mot de passe incorrect verrouille un compte. Notre politique de domaine est qu'un compte verrouillera après trois entrées incorrectes, donc je suppose que je fais quelque chose de mal dans mon code. Je ne suis pas très bien informé sur Active Directory ou .NET DirectoryServices en général, ce qui peut être évident à partir de mon code. Ici, il est:Le compte Active Directory est verrouillé au premier essai

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

Sans rapport avec votre question, mais dans le monde où est le point 'catch (Exception) {throw; } '? –

+0

Rien :) Je le mets parfois si je pense que je devrais faire des manipulations supplémentaires là-bas. Je l'utilise également lors du débogage, et cela sert de rappel supplémentaire que ces exceptions pourraient se produire ici. – MJB

Répondre

0

Je l'ai fait quelques recherches et a trouvé un peu de code (grâce à Ayende Rahien pour la solution) à utiliser que juste authentifie et ne recherche pas les e-mails ou quoi que ce soit d'autre. J'utilise ceci avant l'autre fonction, et cela semble fonctionner correctement. Je devine que mon autre code frappe AD plus d'une fois - au moins 3 fois - ce qui entraîne le lock-out. Voici le code que j'utilise maintenant pour m'authentifier:

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

En note, une règle générale pour les tentatives de mot de passe est de le faire passer à 10 ou plus. Ceci est dû au fait que divers composants Windows sont connus pour réessayer silencieusement plusieurs fois avant de donner finalement le message "Accès refusé". De plus, une telle limite peut mener à des attaques DOS très réussies où l'attaquant essaie simplement d'empêcher les autres de se connecter. dans. – NotMe

+0

Merci, mais ce n'est pas mon appel. Je ne pense pas que notre administrateur réseau acceptera cela. Concernant les attaques DOS: ce site est interne uniquement. – MJB