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 認証する方法について紹介した。
0 件のコメント:
コメントを投稿