Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用用户名和密码连接LDAP?_Ldap_Openldap_Ldap Query - Fatal编程技术网

如何使用用户名和密码连接LDAP?

如何使用用户名和密码连接LDAP?,ldap,openldap,ldap-query,Ldap,Openldap,Ldap Query,我的Ldap工作正常。我面临的唯一问题是当我尝试使用电子邮件登录时,即当我在下面代码的else部分登录时。如果我的用户名与电子邮件不同,则会抛出错误。i、 e如果我的电子邮件是'skumar@gmail.com我的用户名是“saurakumar”,然后它将通过无效的用户名密码错误。 在内部,我使用用户名发送电子邮件,即如果用户使用名称“karan”登录,那么我希望电子邮件为karan@gmail.com,这在许多情况下都不正确,身份验证失败。我正在寻找一些解决方案,其中我可以通过电子邮件或用户名

我的Ldap工作正常。我面临的唯一问题是当我尝试使用电子邮件登录时,即当我在下面代码的else部分登录时。如果我的用户名与电子邮件不同,则会抛出错误。i、 e如果我的电子邮件是'skumar@gmail.com我的用户名是“saurakumar”,然后它将通过无效的用户名密码错误。 在内部,我使用用户名发送电子邮件,即如果用户使用名称“karan”登录,那么我希望电子邮件为karan@gmail.com,这在许多情况下都不正确,身份验证失败。我正在寻找一些解决方案,其中我可以通过电子邮件或用户名登录,我将能够验证用户身份。下面是我的代码片段。请建议

    ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
    ldapEnv.put(Context.PROVIDER_URL, url);
    ldapEnv.remove(Context.SECURITY_PROTOCOL);
    if (email == null) {
        lContext = new InitialLdapContext(ldapEnv, null);
        entryResult = searchUserEntry(lContext, user, searchCtrls);
        final String usrDN = ((Context) entryResult.getObject()).getNameInNamespace();

        lContext.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
        lContext.addToEnvironment(Context.SECURITY_PRINCIPAL, usrDN);
        lContext.addToEnvironment(Context.SECURITY_CREDENTIALS, pass);
        lContext.reconnect(null);
    } else {
            ldapEnv.put(Context.SECURITY_PRINCIPAL, email);
            ldapEnv.put(Context.SECURITY_CREDENTIALS, credentials);
            lContext = new InitialLdapContext(ldapEnv, null);
            return lContext;
        searchUserEntry(lContext, user, searchCtrls);
    }

通常这是一个三步过程:

作为管理用户绑定到LDAP。请注意,这不应该是配置文件中定义的主用户:这是用于OpenLDAP本身的。相反,应该是DIT中提到的具有下一步适当搜索权限的用户

通过一些独特的属性搜索用户,例如在您的电子邮件中

使用找到的用户DN和他指定的密码,在适当更改上下文环境后,尝试使用reconnect方法绑定为该用户


如果所有这些都成功了,那么您的登录成功了。如果2或3失败,则表示您有一个失败,请注意,您不应告诉用户它是哪一个:否则,您将向攻击者泄漏信息。您不应提及是用户名电子邮件还是密码错误。

这是否有帮助:您正在将电子邮件值传递给Context.SECURITY\u PRINCIPAL属性,该属性实际上应该保存用户的绑定DN。@Bora在这种情况下如何获取绑定DN?@Saurabh我不确定是否理解您的代码逻辑,但是您会得到条目的DN,该条目的mail属性可能等于email的值。您似乎是在用户的if email==null{块中执行此操作,并将DN存储在usrDN中。然后,您可能希望在目录中创建一个条目,可以将其用作a/n应用程序/功能ID,您将首先使用其DN和密码绑定到目录,并搜索用户电子邮件以获取用于身份验证的DN。