Autenticación de usuarios contra Active Directory en C#

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Use el espacio de nombres System.DirectoryServices.AccountManagement para validar un usuario contra Active Directory en C#
  2. Use el espacio de nombres System.DirectoryServices para validar un usuario contra Active Directory en C#
  3. Use el espacio de nombres System.DirectoryServices.Protocols para validar un usuario contra Active Directory en C#
  4. Utilice el método ActiveDirectoryMembershipProvider.ValidateUser(String, String) para validar un usuario contra AD en C#
Autenticación de usuarios contra Active Directory en C#

La autenticación de la cuenta contra Active Directory es posible al validar las credenciales en función de la información del usuario proporcionada y devolver el resultado al método de llamada. Este tutorial enseñará cuatro formas posibles de autenticar o validar un usuario contra Active Directory en C#.

Use el espacio de nombres System.DirectoryServices.AccountManagement para validar un usuario contra Active Directory en C#

Uno de los métodos más fáciles, si trabaja en .NET 3.5 o versiones más nuevas que pueden verificar o validar las credenciales de usuario. Los objetivos principales de este espacio de nombres son simplificar las operaciones de administración principales y hacerlas coherentes independientemente del directorio subyacente y proporcionar resultados confiables para estas operaciones.

En general, los desarrolladores de C# que crean aplicaciones basadas en directorios a menudo necesitan autenticar las credenciales de los usuarios almacenados en Active Directory, y realizan esta tarea utilizando la clase DirectoryEntry para forzar una operación de vinculación LDAP bajo el capó.

Dado que es extremadamente fácil escribir código C# pobre que no sea seguro, los desarrolladores deben tener cuidado al escribir código altamente seguro. Le permite superar las limitaciones inherentes en Active Directory, pero a expensas de escribir un código C# más complicado.

Código de ejemplo:

using System;
using System.Windows.Forms;
using System.DirectoryServices.AccountManagement;

namespace activeDirectoryAuthentication {
  public partial class Form1 : Form {
    string username, password;
    public Form1() {
      InitializeComponent();
    }

    // insert username in textfield by user
    private void textBox1_TextChanged(object sender, EventArgs e) {
      username = textBox1.Text;
    }

    // insert password in textfield by user
    private void textBox2_TextChanged(object sender, EventArgs e) {
      password = textBox2.Text;
    }

    // click event after the user clicks `Login`
    private void button1_Click(object sender, EventArgs e) {
      try {
        // create a connection to domain, no need to add or mention LDAP:// in domain
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "yourdomain.com")) {
          // validate the credentials
          bool isValid = pc.ValidateCredentials(username, password);
          if (isValid) {
            // User credentials validated
          } else {
            // Not authenticated
          }
        }
      } catch (Exception ex) {
        // throw an exception when a connection to the domain is unsuccessful
      }
    }
  }
}

Use el espacio de nombres System.DirectoryServices para validar un usuario contra Active Directory en C#

Proporciona fácil acceso a los servicios de dominio de Active Directory y contiene dos clases de componentes principales, DirectorySearcher y DirectoryEntry, para utilizar la tecnología de interfaces de servicios de Active Directory. Valida fácilmente a los usuarios contra Active Directory al ubicar y administrar los recursos en una red, independientemente de su tamaño.

Permite que sus aplicaciones utilicen una sola interfaz para interactuar con diversas direcciones en Internet. Utiliza una estructura de árbol donde cada nodo representa un conjunto de propiedades, y puede usarlo para buscar, recorrer y editar el árbol, así como leer/escribir las propiedades de un nodo.

La clase DirectoryEntry encapsula un nodo en la jerarquía de AD Domain Services y puede vincular objetos, leer propiedades y actualizar atributos o cuentas de usuario. Utilice la clase DirectorySearcher para realizar consultas contra el Directorio Activo para validar y autenticar a los usuarios.

Código de ejemplo:

using System;
using System.Windows.Forms;
using System.DirectoryServices;

namespace activeDirectoryAuthentication {
  public partial class Form1 : Form {
    string username, password;
    public Form1() {
      InitializeComponent();
    }

    // insert username in textfield by user
    private void textBox1_TextChanged(object sender, EventArgs e) {
      username = textBox1.Text;
    }

    // insert password in textfield by user
    private void textBox2_TextChanged(object sender, EventArgs e) {
      password = textBox2.Text;
    }

    // click event after the user clicks `Login`
    private void button1_Click(object sender, EventArgs e) {
      IsValidUser(username, password);
    }

    private bool IsValidUser(string username, string password) {
      bool isValid = false;
      try {
        DirectoryEntry entry = new DirectoryEntry("LDAP://yourdomain.com", username, password);
        object nativeObj = entry.NativeObject;
        isValid = true;
      } catch (DirectoryServicesCOMException comex) {
        // Not Authenticated. comex.Message will return the reason
      } catch (Exception ex) {
        // optional
      }
      return isValid;
    }
  }
}

Use el espacio de nombres System.DirectoryServices.Protocols para validar un usuario contra Active Directory en C#

A diferencia de otros métodos para validar un usuario contra Active Directory, puede diferenciar entre una contraseña que requiere modificaciones y un usuario con una contraseña incorrecta. Mostrará excepciones si la contraseña de usuario requiere cambio o no existe.

Utiliza el lexc.ServerErrorMessage para lanzar excepciones cuyo valor de datos es una representación hexadecimal del código Error Win32. Los códigos de error que contiene lexc.ServerErrorMessage son los mismos, que se devolverían al invocar la llamada a la API Win32 LogonUser.

El espacio de nombres System.DirectoryServices.Protocols en C# proporciona los métodos definidos en los estándares LDAP versión 3 y DSML versión 2.0. Con la ayuda de la clase LdapConnection, crea una conexión TCP/IP o UDP LDAP a Active Directory para autenticar a un usuario.

Código de ejemplo:

using System;
using System.Net;
using System.Windows.Forms;
using System.DirectoryServices.Protocols;

namespace activeDirectoryAuthentication {
  public partial class Form1 : Form {
    string username, password;
    public Form1() {
      InitializeComponent();
    }

    // insert username in textfield by user
    private void textBox1_TextChanged(object sender, EventArgs e) {
      username = textBox1.Text;
    }

    // insert password in textfield by user
    private void textBox2_TextChanged(object sender, EventArgs e) {
      password = textBox2.Text;
    }

    // click event after the user clicks `Login`
    private void button1_Click(object sender, EventArgs e) {
      try {
        LdapConnection adDatabaseCon = new LdapConnection("LDAP://enteryourdomainaddress.com");
        NetworkCredential credential = new NetworkCredential(username, password);
        adDatabaseCon.Credential = credential;
        adDatabaseCon.Bind();
        MessageBox.Show("You are logged in successfully!");
      } catch (LdapException lexc) {
        String error = lexc.ServerErrorMessage;
        // MessageBox.Show(lexc);
      } catch (Exception exc) {
        // MessageBox.Show(exc);
      }
    }
  }
}

Utilice el método ActiveDirectoryMembershipProvider.ValidateUser(String, String) para validar un usuario contra AD en C#

Pertenece al espacio de nombres System.Web.Security, y su objetivo principal es verificar o validar el nombre de usuario y la contraseña especificados en Active Directory. Presenta dos parámetros, el primero es la cadena de nombre de usuario y el otro es la cadena de contraseña que representa la contraseña para el usuario especificado.

Este método devuelve un valor booleano como true o false. El true representa un usuario válido, y el método ValidateUser(String, String) devuelve false si el usuario no existe en Active Directory.

La clase Membresía llama a este método para validar las credenciales de usuario contra AD, y si devuelve false incluso cuando se proporcionan las credenciales correctas, también aclara los motivos. Al validar un usuario, el proveedor valida las credenciales conectándose a Active Directory utilizando el nombre de usuario y la contraseña especificados, no las credenciales configuradas en el archivo de configuración de la aplicación.

Sin embargo, la instancia ActiveDirectoryMembershipProvider se conectará al directorio usando las credenciales configuradas para confirmar que existe un usuario dentro del ámbito de búsqueda y comprobar que la propiedad EnablePasswordReset es verdadera, y usará las credenciales configuradas para cargar el instancia de usuario.

Código de ejemplo:

using System;
using System.Windows.Forms;
using System.Web.Security;  // moved in System.Web.ApplicationServices

namespace activeDirectoryAuthentication {
  public partial class Form1 : Form {
    string username, password;
    bool publicC;
    public Form1() {
      InitializeComponent();
    }

    // insert username in textfield by user
    private void textBox1_TextChanged(object sender, EventArgs e) {
      username = textBox1.Text;
    }

    // insert password in textfield by user
    private void textBox2_TextChanged(object sender, EventArgs e) {
      password = textBox2.Text;
    }

    // to check if the account is a public account or an admin account
    private void radioButton1_CheckedChanged(object sender, EventArgs e) {
      publicC = radioButton1.Checked;
    }

    // click event after the user clicks `Login`
    private void button1_Click(object sender, EventArgs e) {
      // use `ActiveDirectoryMembershipProvider` as the default membership provider
      var adok = Membership.Provider.ValidateUser(username, password);

      if (Membership.ValidateUser(username, password)) {
        FormsAuthentication.RedirectFromLoginPage(username, publicC);
      } else
        MessageBox.Show("Login failed. Please check your user name and password and try again.");
    }
  }
}

La autenticación de Active Directory simplifica la experiencia de inicio de sesión para los usuarios y reduce el riesgo de ataques al maximizar la seguridad. Con la ayuda de Active Directory, puede validar una cuenta inmediatamente usando las credenciales actualizadas del usuario con dispositivos locales y aplicaciones C#.

Active Directory de Microsoft es una parte fundamental de la infraestructura de TI y, sin un enfoque adecuado para el acceso, puede poner en riesgo todo el entorno de TI. En este tutorial, aprendió las formas optimizadas de validar o autenticar un usuario/cuenta contra Active Directory en C#.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

Artículo relacionado - Csharp Authentication