Autenticación de usuarios contra Active Directory en C#
-
Use el espacio de nombres
System.DirectoryServices.AccountManagement
para validar un usuario contra Active Directory enC#
-
Use el espacio de nombres
System.DirectoryServices
para validar un usuario contra Active Directory enC#
-
Use el espacio de nombres
System.DirectoryServices.Protocols
para validar un usuario contra Active Directory enC#
-
Utilice el método
ActiveDirectoryMembershipProvider.ValidateUser(String, String)
para validar un usuario contra AD enC#
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#.
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