Active Directoryを介したLDAPを使用したPHPでの認証


104

PHPでLDAPを介してユーザーを認証する方法を探しています(プロバイダーはActive Directoryです)。理想的には、IIS 7で実行できる必要があります(adLDAPはApacheで実行できます)。誰かが似たようなことをして成功しましたか?

  • 編集:準備ができているコードを含むライブラリ/クラスを好む...誰かがすでにそうしているときにホイールを発明するのはばかげているでしょう。

drupalにはthatr用のモジュールがあると思います
redben

回答:


167

ライブラリ全体をインポートすることは、必要なものが本質的に2行のコードである場合は非効率的です...

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}

43
提供されたパスワードが空の場合、ADの一部のインストールは正常にバインドします。これに気をつけて!認証を試みる前に、空でないパスワードを確認する必要がある場合があります。
diolemo 2011年

@diolemoパスワードが空かどうかを確認せずにこれを防ぐ方法はありますか?
Naftali別名Neal

@Nealを使用ldap_set_optionして、別の方法で動作させることができる場合があります。おそらくプロトコルのバージョンを設定していますか?実験する必要があります。安全のため、とにかく空のパスワードをチェックすることをお勧めします。
diolemo 2013年


匿名の編集者へ:いいえ、私の知る限り、ここでは入力のサニタイズは必要ありません。ldap_bind処理するため、特殊文字は問題になりません。
ceejayoz 2014年

14

ライブラリを必要とせずに、Active Directoryでユーザーを認証するだけで、PHPでLDAPを使用するかなり単純なプロセスであると考えるでしょう。しかし、それをかなり速く複雑にすることができる多くのものがあります:

  • 入力を検証する必要があります。それ以外の場合は、空のユーザー名/パスワードが渡されます。
  • バインド時にユーザー名/パスワードが適切にエンコードされていることを確認する必要があります。
  • TLSを使用して接続を暗号化する必要があります。
  • ダウンした場合の冗長性のために別々のLDAPサーバーを使用する。
  • 認証が失敗した場合に有益なエラーメッセージを取得します。

ほとんどの場合、上記をサポートするLDAPライブラリを使用する方が実際には簡単です。最終的に、上記のすべてのポイントを処理する独自のライブラリをロールバックすることになりました。次のように使用できます。

use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;

$domain = (new DomainConfiguration('example.com'))
    ->setUsername('username') # A separate AD service account used by your app
    ->setPassword('password')
    ->setServers(['dc1', 'dc2', 'dc3'])
    ->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);

if (!$ldap->authenticate($username, $password, $message)) {
    echo "Error: $message";
} else {
    // Do something...
}

上記の認証呼び出しは次のようになります。

  • ユーザー名もパスワードも空でないことを確認します。
  • ユーザー名/パスワードが適切にエンコードされていることを確認してください(デフォルトではUTF-8)
  • ダウンしている場合に備えて、代替LDAPサーバーを試してください。
  • TLSを使用して認証要求を暗号化します。
  • 失敗した場合の追加情報を提供します(つまり、ロック/無効化されたアカウントなど)

これを行う他のライブラリもあります(Adldap2など)。ただし、最も投票された回答は実際には入力検証が行われず、TLSを使用せずに信頼できるセキュリティリスクであるため、いくつかの追加情報を提供する必要が十分にありました。


1
LDAP接続の場合、StartTLS:openldap.org/faq/data/cache/605.htmlに代わり、TLSは非推奨になりました。
zenlord

2
@zenlord ldaps://接続にこのフォーマットを使用することは非推奨です。私の例では、指定するsetUseTls(true)ldap://フォーマットが使用され、を使用してStartTLSが発行されますldap_start_tls($connection)。したがって、TLS自体は廃止されていません。使用して接続するだけですldaps://(実際には完全に異なるポートを介してLDAPに接続します)。
ChadSikorra

12

これを行うには、ユーザー資格情報をldap_bind()に渡します。

http://php.net/manual/en/function.ldap-bind.php

アカウントがLDAPにバインドできる場合、それは有効です。できない場合はそうではありません。あなたがしているすべてが認証(アカウント管理ではない)である場合、私はライブラリの必要性を理解していません。




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.