2011-02-12 24 views
7

Estoy usando el código siguiente para autenticar a un usuario en Active Directory, pero la contraseña está enviando en texto claro. ¿Cómo puedo codificar mi contraseña y luego enviarla a Active Directory?Autenticación de Active Directory

DirectoryEntry entry = new DirectoryEntry(path, username, pwd); 
try 
{ 
    //Bind to the native AdsObject to force authentication. 
    object obj = entry.NativeObject; 

    DirectorySearcher search = new DirectorySearcher(entry); 

    search.Filter = "(SAMAccountName=" + username + ")"; 
    search.PropertiesToLoad.Add("cn"); 
    SearchResult result = search.FindOne(); 

    if (null == result) 
    { 
     return false; 
    } 

    //Update the new path to the user in the directory. 
    _path = result.Path; 
    _filterAttribute = (string)result.Properties["cn"][0]; 
} 
catch (Exception ex) 
{ 
    throw new Exception("Error authenticating user. " + ex.Message); 
} 

return true; 
+0

Esta es una buena pregunta. Por curiosidad, ¿qué AuthenticationType estás usando? – Pandincus

+0

cuál es su significado de AuthenticationType, estoy usando System.DirectoryServices; espacio de nombre y código mencionado para Autenticar –

Respuesta

6

Si está utilizando .NET 3.5, te recomiendo encarecidamente el cambio a utilizar el espacio de nombres System.DirectoryServices.AccountManagement (leer todos los detalles: Managing Directory Security Principals in the .NET Framework 3.5).

Muchas cosas son mucho más fáciles de S.DS.AM - como la autenticación de usuarios:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
ctx.ValidateCredentials("test", "test", ContextOptions.SecureSocketLayer); 

La única manera de hacerlo es con seguridad especificando la opción ContextOptions.SecureSocketLayer para hacer cumplir el uso de un SSL conexión protegida.

Si no se puede mover a .NET 3.5 y S.DS.AM, es necesario revisar la AuthenticationTypes que se puede definir en el fourth overloaded constructor de DirectoryEntry:

DirectoryEntry entry = 
    new DirectoryEntry(path, username, pwd, 
         AuthenticationTypes.SecureSocketsLayer); 

No hay otra manera de hacer esto, yo soy temo que no creo que haya ninguna forma de que el lado del cliente codifique la contraseña del mismo modo que Windwos Server/Active Directory, y transfiera ese valor hash ...

+0

Todavía falló :(. Tal vez algo malo en mí. Entonces, si tengo el servidor LDAP 'https: // example.com', ¿qué debería pasar como argumento' ruta' del constructor 'DirectoryEntry' ? Gracias – BornToCode

+0

@BornToCode: necesita encontrar la ruta ** LDAP ** adecuada para su servidor - algo así como 'LDAP: // YourServer/DC = YourCOmpany, dc = com' - ese enlace https realmente no ayuda mucho ... –

Cuestiones relacionadas