2016-08-25 5 views
1

私が持っている:成功したLDAPバインドで認証されたユーザーのオブジェクトGUIDを知る方法

  • Linuxサーバ上でPHPアプリケーション
  • (Windowsサーバ2012)のドメインコントローラ

私は、ADユーザーがPHPアプリケーションにログインできるようにしたいと考えています。 PHPアプリケーションはデータをユーザに関連付けるので、データベースにユーザを作成する必要があります。

新しいユーザーがPHPアプリケーションで作成されると、管理者はADユーザーのuserPrincipalNameのリストから選択します。 userPrincipalNameが選択されると、PHPはこのユーザのobjectGUIDを取得し、データベースに格納します。実際、UPNが変更される可能性があるため、ユーザーを一意に識別するためにUPNに依存することはできません。また、UPNが変更された場合、ユーザーは新しいUPNを使用してPHPアプリケーションにシームレスにログインできます。

ユーザが自分のアプリケーションにログインしたい場合、PHPはユーザ名とパスワードを受け取り、ldap_bindに渡して資格情報が有効かどうかをチェックします。その時点での問題は、ldap bindが実際にどのユーザーを識別したのか(ldap_bindはログイン/パスワード(https://msdn.microsoft.com/en-us/library/cc223499.aspx)を検証する複雑なロジックを持っているかを知ることはできません)です。

ldapバインドがobjectGUIDを返していた場合は、最も基本的な(したがって、信頼性の高い)方法です。しかし、そうではありません。PHPでldapバインドのロジックをどのユーザーが実際に識別したのか(LDAPバインドと「手動」検索の間でディレクトリが変更された場合、競合状態のためにバグが発生する)

PHPからLDAPユーザーを識別し、可能であれば、ドメインコントローラへの1回の要求で(アトミック性を得るために)?

答えて

0

プロセスのある時点で、ログインのユーザー名に使用されているUPNを検索するロジックを持つ必要があります。そのオブジェクトGUIDを取得し、データベースのobjectGuidを検索します。その情報を得る他の方法はありません。

潜在的な競合状態(結びつきと検索間のタイミングが非常に厳しいことを考えると、非常に端のように見える)が心配な場合は、別のADサービスアカウントを使用してバインドの前にUPNによってアカウントを作成します。次に、ユーザーの資格情報を確認するldap_bindでは、検索するアカウントのobjectGuidを使用して、ADバインドの有効な「ユーザー名」(その中括弧を含むGUID)を使用することもできます。

+0

はい、私は最後に、UPNでGUIDを取得してからバインドします(これにより、ユーザーはUPNを入力する必要がありますが、これはバインド許可よりも制限的です)。しかし、GUIDを使用してバインドするあなたの考えは、UPNを再び使用するより安全です(これは私がやった)、ありがとう!私はそれが最悪のケースだと知っていますが、私はLDAP APIで何かを逃してはいけないと確信していました。なぜなら、多くのアプリが同じ問題を抱えていることがわかっていたからです。 – user368507

+0

私は、指定された "ユーザー名"を持つユーザーを検索してユーザーのDNを取得し、そのTHENを使用してバインドを実行します。検索のために、私は検索機能を持つ定義されたユーザーと結びついています。それは、UPnとバインドするAD能力に依存しないので、他のLDAPバックエンドでも機能します。その検索中にobjectGUIDを取得して、競合状態が存在しないようにすることもできます。追加されたメリット:使用されている検索フィルタに応じて、メールアドレスや電話番号などを使用してログインすることもできます) – heiglandreas

+0

@heiglandreasもっと広いユーザーをサポートするために開発されたアプリケーションの場合は、 。しかし、それが内部的に開発されたアプリケーションであり、ADを使用している場合、バインドにサポートされている他のユーザー名メソッドの1つを使用しても問題はありません。 DNは変更できますが、objectGuidでは変更できません。私は実際にADでサポートされている追加のバインド・フォーマットは(私はそこにモジュールがない場合、または行動のこの種のを許可するに追加驚いて)OpenLDAPのような実装を超える利点だと思います。 – ChadSikorra

関連する問題