2011-10-31 5 views
3

J'ai une application web où j'ai une page de connexion. Comment s'authentifier auprès des utilisateurs du répertoire actif? A partir de maintenant, je suis en mesure d'obtenir des propriétés du répertoire actif, ce qui conclut que je suis capable de communiquer avec AD avec LDAP chaîne.Je sais pas possible d'extraire le mot de passe de AD et authentifier contre mot de passe entré par l'utilisateur !! .Vous authentifier contre un utilisateur dans le répertoire actif?

Y a-t-il un moyen de m'authentifier auprès des utilisateurs de l'annuaire actif?

Voici mon code jusqu'à présent

 public class Userdetails 
{ 
    public static string ADPath = ConfigurationManager.AppSettings.Get(“ADPath”); // Get the ADAM Path from web config fiel 
    public static string ADUser = ConfigurationManager.AppSettings.Get(“ADUser”); //ADAM Administrator 
    public static string ADPassword = ConfigurationManager.AppSettings.Get(“ADPassword”); //ADAM Administrator password 

public static DirectoryEntry GetUserDetails(string userID) 
{ 
     AuthenticationTypes AuthTypes; // Authentication flags. 
     // Set authentication flags. 
     // For non-secure connection, use LDAP port and 
     // ADS_USE_SIGNING | 
     // ADS_USE_SEALING | 
     // ADS_SECURE_AUTHENTICATION 
     // For secure connection, use SSL port and 
     // ADS_USE_SSL | ADS_SECURE_AUTHENTICATION 
     AuthTypes = AuthenticationTypes.Signing | 
      AuthenticationTypes.Sealing | 
      AuthenticationTypes.Secure; 
     DirectoryEntry De = new DirectoryEntry(ADPath, ADUser, ADPassword, AuthTypes); 
    DirectorySearcher Ds = new DirectorySearcher(De); 
    SearchResult Sr; 
    Ds.SearchScope = SearchScope.Subtree; 
    Ds.Filter = “(&(objectclass=*)(cn= ” + userID + “))”; 
    Sr = Ds.FindOne(); 
    if (!(Sr == null)) 
    { 
     De = new DirectoryEntry(Sr.Path, ADUser, ADPassword, AuthTypes); 
     return De; 
    } 
    else 
    { 
     return null; 
    } 
} 
+0

Un serveur Active Directory sera en mesure de recevoir le nom d'utilisateur et mot de passe et vous dire si c'est le mot de passe correct ou non, sans activer les mots de passe réversibles. Donc ça devrait être possible. – jishi

+0

Quelle version de C# utilisez-vous? – chilltemp

+0

J'utilise C# 3.5 – Macnique

Répondre

7

http://msdn.microsoft.com/en-us/library/bb299745.aspx

http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.aspx

http://msdn.microsoft.com/en-us/magazine/cc135979.aspx

public bool Validate(string username, string password) 
    { 

     //ex PrincipalContext principalContext = new PrincipalContext(ContextType.ApplicationDirectory,"sea-dc-02.fabrikam.com:50001","ou=ADAM Users,o=microsoft,c=us",ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind,"CN=administrator,OU=ADAM Users,O=Microsoft,C=US","[email protected]"); 

     try 
     { 
      using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, Configuration.Config.ActiveDirectory.PrimaryServer, Configuration.Config.ActiveDirectory.Container, ContextOptions.Negotiate)) 
      { 
       return principalContext.ValidateCredentials(username, password); 
      } 
     } 
     catch (PrincipalServerDownException) 
     { 
      Debug.WriteLine("PrimaryServer={0};Container={1}", Configuration.Config.ActiveDirectory.PrimaryServer, Configuration.Config.ActiveDirectory.Container); 
      Debug.WriteLine("LDAP://{0}/{1}", Configuration.Config.ActiveDirectory.PrimaryServer, Configuration.Config.ActiveDirectory.Container); 
      throw; 
     } 
+0

Où trouvez-vous 'Configuration.Config .ActiveDirectory.PrimaryServer' et 'Configuration.Config.ActiveDirectory.Container'? – ja72

+0

Désolé, ce sont les paramètres de mon code, que j'ai oublié de prendre. Ce sont des constantes/variables représentant le nom du serveur et du conteneur, l'exemple a des valeurs de démonstration – Brian

1

Création d'un nouveau DirectoryEntry avec un mot de passe et l'utiliser avec un DirectorySearcher validera th e mot de passe et lancer une exception si elle échoue. Une exception importante à ceci est les mots de passe vide/nul. La plupart des serveurs LDAP (je pense que l'AD est inclus) ignoreront le paramètre de mot de passe s'il est nul ou vide. Donc, vous devriez tester pour cela en premier.

Old MSDN sample

Questions connexes