web-dev-qa-db-ja.com

Active Directory経由でLDAPを使用してPHPで認証する

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

  • 編集:すぐに使えるコードを備えたライブラリ/クラスが好きです...誰かがすでにそうしているときに車輪を発明するのはばかげているでしょう。
101
DV.

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

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

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

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

実際、ほとんどの場合、上記をサポートするLDAPライブラリを使用する方が簡単です。最終的に、上記のすべてのポイントを処理する独自のライブラリを公開しました。 LdapTools (認証だけでなく、もっと多くのことができます)。次のように使用できます。

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を使用しない場合に依存するセキュリティリスクであるため、追加情報を提供するのに十分であると感じました。

14
ChadSikorra

これは、ユーザー資格情報をldap_bind()に渡すだけで簡単に行えます。

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

アカウントがLDAPにバインドできる場合、それは有効です。できない場合、そうではありません。アカウント管理ではなく認証のみを行う場合、ライブラリの必要性はわかりません。

11
Scott Reynen

Zend_Ldap クラスが好きです。ZendFrameworkなしで、このクラスのみをプロジェクトで使用できます。

9
CMS

PHPにはライブラリがあります: http://ca.php.net/ldap

PEARには多くのパッケージもあります。 http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=

私もどちらも使いませんでしたが、私はある時点で行って、彼らはうまくいくように見えました。

6
Darryl Hein

完全な例を探している人は、 http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/ をチェックしてください。

Windows Server 2003 Webサーバー(IIS6)およびIIS 8を実行しているWindows Server 2012エンタープライズからWindows Server 2003およびWindows Server 2008 R2ドメインコントローラーへの接続をテストしました。

5
Joe Meyer