.NET6 以降、C#で Active Directory(LDAP)認証する方法

2023年1月26日木曜日

C#

t f B! P L

C#で、Active Directory(LDAP)認証して、ユーザー名などの情報を取得する方法を紹介する。

準備

お試し用のコンソールアプリのプロジェクトを作る。

「System.DirectoryServices」をインストール

C#で LDAP プロトコル認証するには、「System.DirectoryServices」を参照に加えておく必要がある。Visual Studio 2022などの IDEを使っているなら、nuget の GUIでインストールする。

上記以外のツール(VS Codeなど)を使っている場合は、コマンドで「System.DirectoryServices」の参照を追加する。

dotnet add package System.DirectoryServices --version 7.0.0

認証を実装

Active Directory に接続して、指定したユーザーID とパスワードで認証(バインド)する処理を作る。

using System.DirectoryServices;

static void Main(string[] args) {
  string userId = "username@example.com";  // ユーザーIDとドメイン
  string password = "password";            // パスワード

  try {
    using (DirectoryEntry entry = new DirectoryEntry(
    "LDAP://example.com", //接続先 
    userId,
    password)) {

      var obj = entry.NativeObject;  //認証に失敗すると、ここで例外が発生する。
      Console.WriteLine("認証成功");
    }
  } catch (Exception ex) {
    Console.WriteLine(ex.Message);
  }
}

バインドで認証する方法の場合、DirectoryEntry クラスに接続先、ユーザーID、パスワードを指定し、そのインスタンスの NativeObject を見ることで、認証に成功したかを確認する。

ユーザー名の取得

一般的なアプリケーションでは、ログイン認証後、画面上にログインしたユーザー名を表示する。そのため、Active Directory での認証成功後、ディレクトリを検索してユーザー名を取得するコードも書いてみる。

using (DirectorySearcher searcher = new DirectorySearcher(entry)) {
 searcher.SearchScope = SearchScope.Subtree;
 searcher.Filter = $"(&(objectClass=user)(userPrincipalName={userId}))"; //検索フィルタ
 SearchResult result = searcher.FindOne();
 
 if (null == result) {
   Console.WriteLine("user not found");
 } else {
   var name = result.GetDirectoryEntry().Properties["DisplayName"].Value; 
   Console.WriteLine($"ユーザ名:{name}");
 }
}

※ もし、バインドしたユーザーに、ディレクトリの検索権限がない場合は、上のコードは正常に動作しない。その場合は、別途、ディレクトリ検索が可能な管理者ユーザー等でバインドして、検索をする必要がある。

まとめ

C#で Active Directory 認証する方法について紹介した。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ