Benutzerauthentifizierung gegen Active Directory in C#

Syed Hassan Sabeeh Kazmi 12 Oktober 2023
  1. Verwenden Sie den Namensraum System.DirectoryServices.AccountManagement, um einen Benutzer gegen Active Directory in C# zu validieren
  2. Verwenden Sie den Namespace System.DirectoryServices, um einen Benutzer anhand von Active Directory in C# zu validieren
  3. Verwenden Sie den Namespace System.DirectoryServices.Protocols, um einen Benutzer anhand von Active Directory in C# zu validieren
  4. Verwenden Sie die Methode ActiveDirectoryMembershipProvider.ValidateUser(String, String), um einen Benutzer gegen AD in C# zu validieren
Benutzerauthentifizierung gegen Active Directory in C#

Die Kontoauthentifizierung gegenüber Active Directory ist möglich, indem die Anmeldeinformationen anhand der angegebenen Benutzerinformationen validiert und das Ergebnis an die Aufrufmethode zurückgegeben werden. In diesem Tutorial lernen Sie vier Möglichkeiten zum Authentifizieren oder Validieren eines Benutzers anhand von Active Directory in C# kennen.

Verwenden Sie den Namensraum System.DirectoryServices.AccountManagement, um einen Benutzer gegen Active Directory in C# zu validieren

Eine der einfachsten Methoden, wenn Sie mit .NET 3.5 oder neueren Versionen arbeiten, die Benutzeranmeldeinformationen überprüfen oder validieren können. Die Hauptziele dieses Namensraums bestehen darin, grundlegende Verwaltungsoperationen zu vereinfachen und unabhängig vom zugrunde liegenden Verzeichnis konsistent zu machen und zuverlässige Ergebnisse für diese Operationen bereitzustellen.

Im Allgemeinen müssen C#-Entwickler, die verzeichnisbasierte Anwendungen erstellen, häufig die Anmeldeinformationen von Benutzern authentifizieren, die im Active Directory gespeichert sind, und sie erfüllen diese Aufgabe mit der Klasse DirectoryEntry, um eine LDAP-Bind-Operation im Hintergrund zu erzwingen.

Da es sehr einfach ist, schlechten C#-Code zu schreiben, der nicht sicher ist, müssen Entwickler darauf achten, hochsicheren Code zu schreiben. Es ermöglicht Ihnen, die inhärenten Einschränkungen in Active Directory zu überwinden, jedoch auf Kosten des Schreibens von komplizierterem C#-Code.

Beispielcode:

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
      }
    }
  }
}

Verwenden Sie den Namespace System.DirectoryServices, um einen Benutzer anhand von Active Directory in C# zu validieren

Es bietet einfachen Zugriff auf Active Directory-Domänendienste und enthält zwei primäre Komponentenklassen, DirectorySearcher und DirectoryEntry, um die Active Directory Services Interfaces-Technologie zu verwenden. Es validiert Benutzer einfach anhand des Active Directory, indem es Ressourcen in einem Netzwerk unabhängig von ihrer Größe lokalisiert und verwaltet.

Es ermöglicht Ihren Anwendungen, eine einzige Schnittstelle zu verwenden, um mit verschiedenen Richtungen im Internet zu interagieren. Es verwendet eine Baumstruktur, in der jeder Knoten einen Satz von Eigenschaften darstellt, und Sie können damit den Baum durchsuchen, durchlaufen und bearbeiten sowie die Eigenschaften eines Knotens lesen/schreiben.

Die Klasse DirectoryEntry kapselt einen Knoten in der Hierarchie der AD-Domänendienste und kann Objekte binden, Eigenschaften lesen und Attribute oder Benutzerkonten aktualisieren. Verwenden Sie die Klasse DirectorySearcher, um Abfragen für das Active Directory durchzuführen, um Benutzer zu validieren und zu authentifizieren.

Beispielcode:

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;
    }
  }
}

Verwenden Sie den Namespace System.DirectoryServices.Protocols, um einen Benutzer anhand von Active Directory in C# zu validieren

Im Gegensatz zu anderen Methoden zur Überprüfung eines Benutzers anhand von Active Directory kann es zwischen einem Kennwort, das geändert werden muss, und einem Benutzer mit einem falschen Kennwort unterscheiden. Es werden Ausnahmen angezeigt, wenn das Benutzerkennwort geändert werden muss oder nicht vorhanden ist.

Es verwendet die lexc.ServerErrorMessage, um Ausnahmen auszulösen, deren Datenwert eine Hex-Darstellung des Win32 Error-Codes ist. Die in lexc.ServerErrorMessage enthaltenen Fehlercodes sind die gleichen, die ansonsten durch Aufrufen des Win32-LogonUser-API-Aufrufs zurückgegeben würden.

Der Namespace System.DirectoryServices.Protocols in C# stellt die Methoden bereit, die in den Standards LDAP Version 3 und DSML Version 2.0 definiert sind. Mit Hilfe der Klasse LdapConnection baut es eine TCP/IP- oder UDP-LDAP-Verbindung zu Active Directory auf, um einen Benutzer zu authentifizieren.

Beispielcode:

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);
      }
    }
  }
}

Verwenden Sie die Methode ActiveDirectoryMembershipProvider.ValidateUser(String, String), um einen Benutzer gegen AD in C# zu validieren

Es gehört zum Namensraum System.Web.Security und dient hauptsächlich dazu, den angegebenen Benutzernamen und das Kennwort im Active Directory zu überprüfen oder zu validieren. Es verfügt über zwei Parameter, der erste ist die Zeichenfolge Benutzername und der andere ist die Zeichenfolge Passwort, die das Kennwort für den angegebenen Benutzer darstellt.

Diese Methode gibt einen booleschen Wert als true oder false zurück. Das true stellt einen gültigen Benutzer dar und die Methode ValidateUser(String, String) gibt false zurück, wenn der Benutzer nicht im Active Directory existiert.

Die Klasse Membership ruft diese Methode auf, um Benutzeranmeldeinformationen gegen AD zu validieren, und wenn sie false zurückgibt, selbst wenn die richtigen Anmeldeinformationen angegeben werden, werden auch die Gründe verdeutlicht. Bei der Validierung eines Benutzers validiert der Anbieter die Anmeldeinformationen, indem er eine Verbindung zum Active Directory unter Verwendung des angegebenen Benutzernamens und Kennworts herstellt, nicht der in der Konfigurationsdatei der Anwendung konfigurierten Anmeldeinformationen.

Die Instanz ActiveDirectoryMembershipProvider stellt jedoch unter Verwendung der konfigurierten Anmeldeinformationen eine Verbindung zum Verzeichnis her, um zu bestätigen, dass ein Benutzer im Suchbereich vorhanden ist, und um zu überprüfen, ob die Eigenschaft EnablePasswordReset auf true gesetzt ist, und verwendet die konfigurierten Anmeldeinformationen zum Laden der Benutzerinstanz.

Beispielcode:

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.");
    }
  }
}

Die Active Directory-Authentifizierung vereinfacht die Anmeldung für Benutzer und reduziert das Risiko von Angriffen durch Maximierung der Sicherheit. Mithilfe von Active Directory können Sie ein Konto sofort validieren, indem Sie die aktualisierten Anmeldeinformationen des Benutzers mit lokalen Geräten und C#-Anwendungen verwenden.

Active Directory von Microsoft ist ein kritischer Bestandteil der IT-Infrastruktur und kann ohne einen angemessenen Zugriffsansatz die gesamte IT-Umgebung gefährden. In diesem Tutorial haben Sie die optimierten Methoden zum Validieren oder Authentifizieren eines Benutzers/Kontos für Active Directory in C# kennengelernt.

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

Verwandter Artikel - Csharp Authentication