C#의 Active Directory에 대한 사용자 인증

Syed Hassan Sabeeh Kazmi 2023년10월12일
  1. System.DirectoryServices.AccountManagement 네임스페이스를 사용하여 C#의 Active Directory에 대해 사용자 유효성 검사
  2. System.DirectoryServices 네임스페이스를 사용하여 C#의 Active Directory에 대해 사용자 유효성 검사
  3. System.DirectoryServices.Protocols 네임스페이스를 사용하여 C#의 Active Directory에 대해 사용자 유효성 검사
  4. ActiveDirectoryMembershipProvider.ValidateUser(String, String) 메서드를 사용하여 C#에서 AD에 대한 사용자 유효성 검사
C#의 Active Directory에 대한 사용자 인증

Active Directory에 대한 계정 인증은 주어진 사용자 정보를 기반으로 자격 증명을 검증하고 그 결과를 call 메서드에 반환함으로써 가능합니다. 이 자습서에서는 C#의 Active Directory에 대해 사용자를 인증하거나 유효성을 검사하는 네 가지 가능한 방법을 설명합니다.

System.DirectoryServices.AccountManagement 네임스페이스를 사용하여 C#의 Active Directory에 대해 사용자 유효성 검사

사용자 자격 증명을 확인하거나 유효성을 검사할 수 있는 .NET 3.5 또는 최신 버전에서 작업하는 경우 가장 쉬운 방법 중 하나입니다. 이 네임스페이스의 기본 목표는 기본 관리 작업을 단순화하고 기본 디렉터리에 관계없이 일관되게 만들고 이러한 작업에 대해 신뢰할 수 있는 결과를 제공하는 것입니다.

일반적으로 디렉토리 기반 애플리케이션을 구축하는 C# 개발자는 종종 Active Directory에 저장된 사용자의 자격 증명을 인증해야 하며 DirectoryEntry 클래스를 사용하여 이 작업을 수행하여 내부에서 LDAP 바인드 작업을 강제합니다.

안전하지 않은 열악한 C# 코드를 작성하기가 매우 쉽기 때문에 개발자는 매우 안전한 코드를 작성하도록 주의해야 합니다. 이를 통해 Active Directory에 내재된 한계를 극복할 수 있지만 더 복잡한 C# 코드를 작성해야 합니다.

예제 코드:

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

System.DirectoryServices 네임스페이스를 사용하여 C#의 Active Directory에 대해 사용자 유효성 검사

이것은 Active Directory 도메인 서비스에 대한 쉬운 액세스를 제공하고 Active Directory 서비스 인터페이스 기술을 사용하기 위한 DirectorySearcherDirectoryEntry라는 두 가지 기본 구성 요소 클래스를 포함합니다. 크기에 관계없이 네트워크에서 리소스를 찾고 관리하여 Active Directory에 대해 사용자를 쉽게 검증합니다.

이를 통해 애플리케이션은 단일 인터페이스를 사용하여 인터넷의 다양한 방향과 상호 작용할 수 있습니다. 각 노드가 속성 집합을 나타내는 트리 구조를 사용하며 이를 사용하여 트리를 검색, 트래버스 및 편집하고 노드의 속성을 읽고 쓸 수 있습니다.

DirectoryEntry 클래스는 AD 도메인 서비스 계층의 노드를 캡슐화하고 개체를 바인딩하고, 속성을 읽고, 특성 또는 사용자 계정을 업데이트할 수 있습니다. DirectorySearcher 클래스를 사용하여 Active Directory에 대한 쿼리를 수행하여 사용자를 확인하고 인증합니다.

예제 코드:

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

System.DirectoryServices.Protocols 네임스페이스를 사용하여 C#의 Active Directory에 대해 사용자 유효성 검사

Active Directory에 대해 사용자를 검증하는 다른 방법과 달리 수정이 필요한 암호와 잘못된 암호를 가진 사용자를 구별할 수 있습니다. 사용자 암호를 변경해야 하거나 존재하지 않는 경우 예외를 표시합니다.

lexc.ServerErrorMessage를 사용하여 데이터 값이 Win32 오류 코드의 16진수 표현인 예외를 발생시킵니다. 포함된 lexc.ServerErrorMessage 오류 코드는 동일하며, 그렇지 않으면 Win32 LogonUser API 호출을 호출하여 반환됩니다.

C#의 System.DirectoryServices.Protocols 네임스페이스는 LDAP 버전 3 및 DSML 버전 2.0 표준에 정의된 메서드를 제공합니다. LdapConnection 클래스의 도움으로 Active Directory에 대한 TCP/IP 또는 UDP LDAP 연결을 생성하여 사용자를 인증합니다.

예제 코드:

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

ActiveDirectoryMembershipProvider.ValidateUser(String, String) 메서드를 사용하여 C#에서 AD에 대한 사용자 유효성 검사

이것은 System.Web.Security 네임스페이스에 속하며 주요 목적은 Active Directory에서 지정된 사용자 이름과 암호를 확인하거나 유효성을 검사하는 것입니다. 여기에는 두 개의 매개변수가 있습니다. 첫 번째는 username 문자열이고 다른 하나는 지정된 사용자의 암호를 나타내는 password 문자열입니다.

이 메서드는 부울을 true 또는 false로 반환합니다. true는 유효한 사용자를 나타내고 ValidateUser(String, String) 메서드는 사용자가 Active Directory에 없으면 false를 반환합니다.

Membership 클래스는 AD에 대한 사용자 자격 증명의 유효성을 검사하기 위해 이 메서드를 호출하고 올바른 자격 증명이 제공된 경우에도 false를 반환하는 경우 이유도 명확히 합니다. 사용자의 유효성을 검사할 때 공급자는 응용 프로그램의 구성 파일에 구성된 자격 증명이 아니라 지정된 사용자 이름과 암호를 사용하여 Active Directory에 연결하여 자격 증명의 유효성을 검사합니다.

그러나 ActiveDirectoryMembershipProvider 인스턴스는 구성된 자격 증명을 사용하여 디렉터리에 연결하여 사용자가 검색 범위 내에 있는지 확인하고 EnablePasswordReset 속성이 true인지 확인하고 구성된 자격 증명을 사용하여 사용자 인스턴스.

예제 코드:

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

Active Directory 인증은 사용자의 로그인 경험을 단순화하고 보안을 최대화하여 공격 위험을 줄입니다. Active Directory의 도움으로 온-프레미스 장치 및 C# 애플리케이션에서 사용자의 업데이트된 자격 증명을 사용하여 계정을 즉시 검증할 수 있습니다.

Microsoft의 Active Directory는 IT 인프라의 중요한 부분이며 액세스에 대한 적절한 접근 방식이 없으면 전체 IT 환경을 위험에 빠뜨릴 수 있습니다. 이 자습서에서는 C#의 Active Directory에 대해 사용자/계정의 유효성을 검사하거나 인증하는 최적화된 방법을 배웠습니다.

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

관련 문장 - Csharp Authentication