Delphi LDAP / Active Directory クライアント

ユーザーが Windows ドメインのパスワードでサインインできるようにします。暗号化された接続で Active Directory、OpenLDAP、あるいは任意の LDAP v3 ディレクトリに対して資格情報を検証し、権限を決めるグループを読み取ります。

TsgcLDAPClient

ユーザーの認証、ディレクトリの検索、入れ子になった Active Directory のグループを含むグループメンバーシップの解決のために設計された LDAP v3 クライアントです。

コンポーネントクラス

TsgcLDAPClient(ユニット sgcAuth_LDAP_Client

プロトコル

LDAP v3 (RFC 4511)

対応プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Enterprise および All-Access、加えて sgcAuth パックでも利用できます。sgcWebSockets .NET でも利用可能です。

接続、認証、グループの読み取り

Host にドメインコントローラーを指定し、LDAPS か StartTLS を選び、BindDN / Password にサービスアカウントを設定したうえで、ユーザーが入力した値を渡して Authenticate を呼び出します。

uses
  sgcAuth_LDAP_Classes, sgcAuth_LDAP_Client;

var
  LDAP: TsgcLDAPClient;
  vUserDN: string;
  oGroups: TStringList;
begin
  LDAP := TsgcLDAPClient.Create(nil);
  LDAP.Host := 'dc01.corp.example.com';
  LDAP.Security := ldapsecLDAPS; // 暗黙の TLS、ポート 636
  LDAP.BindDN := 'CN=svc-login,OU=Service,DC=corp,DC=example,DC=com';
  LDAP.Password := 'service-password';
  LDAP.BaseDN := 'DC=corp,DC=example,DC=com';
  // UserSearchFilter でユーザーを検索し、その DN でバインドします
  LDAP.AuthenticationMode := ldapamSearchThenBind;
  LDAP.Connect;

  if LDAP.Authenticate(edtUser.Text, edtPassword.Text, vUserDN) then
  begin
    oGroups := TStringList.Create;
    try
      // True:LDAP_MATCHING_RULE_IN_CHAIN による入れ子グループ
      LDAP.GetUserGroups(vUserDN, oGroups, True);
    finally
      oGroups.Free;
    end;
  end
  else
    ShowMessage(LDAP.LastErrorMessage);
end;
// uses: sgcAuth_LDAP_Classes, sgcAuth_LDAP_Client
TsgcLDAPClient *LDAP = new TsgcLDAPClient(this);
LDAP->Host = "dc01.corp.example.com";
LDAP->Security = ldapsecLDAPS;
LDAP->BindDN = "CN=svc-login,OU=Service,DC=corp,DC=example,DC=com";
LDAP->Password = "service-password";
LDAP->BaseDN = "DC=corp,DC=example,DC=com";
LDAP->AuthenticationMode = ldapamSearchThenBind;
LDAP->Connect();

String UserDN;
if (LDAP->Authenticate(edtUser->Text, edtPassword->Text, UserDN))
{
  TStringList *Groups = new TStringList();
  LDAP->GetUserGroups(UserDN, Groups, true);
  delete Groups;
}

主な機能

デスクトップアプリ、Web バックエンド、サービスのためのディレクトリサインインを、セキュリティの細部まで面倒を見たうえで提供します。

LDAPS と StartTLS

SecurityldapsecLDAPS(ポート636の暗黙TLS)または ldapsecStartTLS(ポート389でのアップグレード)を選択します。サーバーが StartTLS を拒否した場合は接続が閉じられ、クライアントが平文にフォールバックすることはありません。TLSOptions で証明書検証を制御します。

4つのサインインモード

AuthenticationMode は入力された名前をバインド名に変換します。ldapamUPN(user@UPNSuffix)、ldapamDownLevelDomain\user)、ldapamSearchThenBind(サービスバインドと UserSearchFilter)、ldapamDN の4種類です。

入れ子グループ

GetUserGroups は直接の memberOf の値を返し、aNested を指定すると Active Directory のルール LDAP_MATCHING_RULE_IN_CHAIN を使って他のグループ経由で到達するグループもすべて返します。

ページング検索

Search は Simple Paged Results を自動的に使用し(PageSize、既定500)、SizeLimitTimeLimit を尊重し、エントリと参照を TsgcLDAPEntries リストとして返します。

安全なバインド

Bind は空のパスワードを持つ DN をサーバーへ問い合わせることなく拒否し、RFC 4513 の未認証バインドの抜け穴を塞ぎます。WhoAmILastResultCodeLastErrorMessage で、誰としてバインドされているか、なぜ呼び出しが失敗したかが正確にわかります。

1インスタンスで複数スレッド

すべての公開メソッドが直列化されているため、単一の TsgcLDAPClient でマルチスレッドの HTTP サーバーや WebSocket サーバーのログイン要求をまとめて処理できます。

仕様・参考資料

このコンポーネントが実装する標準規格の公式ソースです。

ドキュメント・デモ

コンポーネントリファレンスへの直接リンク、すぐに実行できるデモプロジェクトの入手、体験版のダウンロードができます。

オンラインヘルプ — TsgcLDAPClient このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。
デモプロジェクト — Demos\26.Authentication\05.LDAP_ActiveDirectory LDAPS または StartTLS での接続、すべてのモードでの認証、検索、入れ子グループの一覧表示を収録しています。sgcWebSockets パッケージに同梱されています。以下から体験版をダウンロードできます。
技術ドキュメント (PDF) このコンポーネントの機能、クイックスタート、Delphi および C++ Builder 向けのコードサンプル、一次資料のリファレンスを掲載しています。
ユーザーマニュアル (PDF) ライブラリのすべてのコンポーネントを網羅した総合マニュアルです。
ブログ — Delphi でパスキー、SAML SSO、LDAP、TOTP 2FA によるログインを実現する 6つの認証コンポーネントが1つの Delphi アプリケーションでどう連携するかを解説します。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

Active Directory でサインインしませんか?

体験版をダウンロードして、Delphi のユーザーを既存のディレクトリで認証してください。