Question

Je l'ai mis en place une instance ADAM et ajouté quelques utilisateurs de test. De c # Je peux lier à ADAM en utilisant un compte Windows, mais je ne peux pas lier en utilisant l'un des utilisateurs ADAM. (Je peux lier avec succès les utilisateurs adam dans LDP) et je me suis assuré les utilisateurs sont activés par la définition de l'attribut msDS-UserAccountDisabled à false. Quand je lie avec mes fenêtres je compte la recherche avec succès et apporter des propriétés de retour pour les utilisateurs ADAM mais je suis encore du mal à les authentifier, quand je tente de se lier avec un compte d'utilisateur ADAM Je reçois l'erreur:

Erreur: System.Runtime.InteropServices.COMException (0x8007052e): échec: nom d'utilisateur inconnu ou mot de passe incorrect. à System.DirectoryServices.DirectoryEntry.Bind (Boolean throwIfFail)

Voici le code que je utilise:

string userName = txtUserName.Text;
string password = txtPassword.Text;
string ADConnectionString = "LDAP://localhost:389/CN=sandbox,DC=ITOrg";
DirectoryEntry entry = new DirectoryEntry(ADConnectionString);

entry.Username = "myComputer\\Administrator";
entry.Password = "myPassword";
try 
{
DirectorySearcher searcher = new DirectorySearcher(entry);
searcher.Filter = "(&(objectClass=user)(CN=" + userName + "))";
SearchResultCollection result = searcher.FindAll();
if (result.Count > 0)
{
    //bind with simple bind
    using (DirectoryEntry de = new DirectoryEntry(result[0].Path, userName, password,AuthenticationTypes.None))
    {
         if (de.Guid != null) // this is the line where it dies
         {
              Label1.Text = "Successfully authenticated";
              Label2.Text = result[0].Properties["displayName"][0].ToString();
              Label3.Text = result[0].Properties["telephoneNumber"][0].ToString();
          } else 
          {
             Lable1.Text = "Unable to Authenticate";
          }
     }
}
else
{
    Lable1.Text = "UserName :" + userName + " not found"; 
}
} catch(Exception ex)
{
     Label1.Text = "Error searching: " + ex.ToString();
}

Merci d'avance pour toute aide, très appréciée!

Était-ce utile?

La solution

Il est probablement un problème de format nom d'utilisateur. Lors de l'authentification d'un utilisateur ADAM dans SDS, vous devez utiliser liaison simple LDAP et utiliser un format de nom pris en charge par ADAM. ADAM vous permet techniquement d'utiliser Digest auth aussi, mais qui ne sont pas disponibles dans le SDS (seulement SDS.Protocols), ce qui ne correspond pas à votre approche de code.

Vous utilisez liaison simple parce que vous avez AuthenticationTypes.None établi de sorte qu'une partie est ok. La partie qui est susceptible de mal est alors le format de nom d'utilisateur.

ADAM accepte DN complet de l'utilisateur, leur displayName (si elle est définie et unique) et / ou le userPrincipalName (si elle est définie et unique) comme nom d'utilisateur « bindable », alors commencez avec le DN complet de l'utilisateur et SEEE si cela fonctionne . Si oui, vous pouvez essayer les autres valeurs de nom d'utilisateur ainsi. Notez que vous pouvez mettre ce que vous voulez pour ou userPrincipalName Sélectionnez dans ADAM. Il n'y a pas de validation. Assurez-vous que les valeurs sont uniques.

Si vous voulez vraiment faire un certain type de chose d'authentification de liaison contre ADAM, vous obtenez une meilleure perf et à l'échelle en utilisant la méthode ValidateCredentials de PrincipalContext dans .NET 3.5.

Ce genre de choses est documenté et discuté dans les forums sur http://www.directoryprogramming.net tout le temps et est un endroit que je fréquente beaucoup plus souvent car il est mon site. :) Un ami m'a averti à ce poste ou je ne l'ai jamais vu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top