我有:
我希望AD用户可以登录PHP应用程序。 PHP应用程序将数据与用户关联,因此我需要在我的数据库中创建用户。
在PHP应用程序中创建新用户时,管理员从AD用户的userPrincipalName列表中进行选择。当选择userPrincipalName时,PHP获取该用户的objectGUID并将其存储在数据库中。实际上,由于UPN可以改变,我不能依靠它来唯一地识别用户。此外,我希望如果UPN发生变化,用户可以使用他的新UPN无缝登录到PHP应用程序。
当用户想要登录我的应用程序时,PHP会收到用户名和密码,并将它们传递给ldap_bind以检查凭据是否有效。那时的问题是ldap bind没有给出他实际识别的用户的线索(ldap_bind有一个复杂的验证登录/密码的逻辑(https://msdn.microsoft.com/en-us/library/cc223499.aspx))。
最原子(也就是可靠)的方法是,如果ldap bind返回objectGUID ......但它没有,我不会编写ldap bind的逻辑代码PHP找到他实际识别出的用户(如果目录在ldap bind和我的"手册"搜索之间发生变化,那么因为竞争条件会有错误
那么如果可能的话,我应该如何在对域控制器的单个请求中验证和识别来自PHP的LDAP用户(以获得原子性)?
答案 0 :(得分:0)
在此过程中的某个时刻,您需要具有搜索登录中用于用户名的UPN的逻辑,获取其objectGuid,并在数据库中搜索该objectGuid。没有其他方法可以获得这些信息。
如果您担心潜在的竞争条件(这看起来非常简陋,鉴于绑定和搜索之间的时间非常紧张),您可以使用单独的AD服务帐户来搜索UPN在绑定之前的帐户。然后在ldap_bind
中查看用户的凭据,您甚至可以使用搜索到的帐户中的objectGuid进行登录,因为这是一个有效的"用户名"对于AD绑定(带有花括号的GUID)。