Authentication 无法在IBM Worklight中使用LDAP身份验证进行身份验证

Authentication 无法在IBM Worklight中使用LDAP身份验证进行身份验证,authentication,ldap,ibm-mobilefirst,Authentication,Ldap,Ibm Mobilefirst,我正在使用IBM Worklight开发一个移动应用程序,我在身份验证方面遇到了一些问题。我使用一个自定义验证器和一个自定义登录模块来验证Tivoli目录服务器上的用户凭据 这是我正在使用的代码,当我在Worklight Studio中像java应用程序一样运行它(带有主方法的类)时,它会工作,但当我像Worklight应用程序一样运行它(在自定义登录模块的登录函数中)时,它会返回一个命名异常并打印jndi.20 public boolean login(Map<String, Objec

我正在使用IBM Worklight开发一个移动应用程序,我在身份验证方面遇到了一些问题。我使用一个自定义验证器和一个自定义登录模块来验证Tivoli目录服务器上的用户凭据

这是我正在使用的代码,当我在Worklight Studio中像java应用程序一样运行它(带有主方法的类)时,它会工作,但当我像Worklight应用程序一样运行它(在自定义登录模块的登录函数中)时,它会返回一个命名异常并打印jndi.20

public boolean login(Map<String, Object> authenticationData) {
    logger.info("SmaciLoginModule :: login");

    try{
        USERNAME = (String) authenticationData.get("username");
        PASSWORD = (String) authenticationData.get("password");
        String solicuser="uid="+USERNAME+",cn=users,dc=smaci,dc=ibm";
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://127.0.0.1:1389/");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, solicuser);
        env.put(Context.SECURITY_CREDENTIALS, PASSWORD);
        DirContext ctx = new InitialDirContext(env);
        boolean result = ctx != null;

                if(ctx != null)
                    ctx.close();

            return result;

        }catch (Exception e) {
            throw new RuntimeException("Invalid credentials"+e.getMessage());
        }
}
公共布尔登录(映射身份验证数据){
info(“SmaciLoginModule::login”);
试一试{
用户名=(字符串)authenticationData.get(“用户名”);
密码=(字符串)authenticationData.get(“密码”);
字符串solicuser=“uid=“+USERNAME+”,cn=users,dc=smac,dc=ibm”;
Hashtable env=新的Hashtable();
put(Context.INITIAL_Context_工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER\u URL,“ldap://127.0.0.1:1389/");
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY_PRINCIPAL,solicuser);
环境放置(Context.SECURITY\u凭证、密码);
DirContext ctx=新的初始DirContext(env);
布尔结果=ctx!=null;
如果(ctx!=null)
ctx.close();
返回结果;
}捕获(例外e){
抛出新的RuntimeException(“无效凭据”+e.getMessage());
}
}
我希望你能帮助我解决我的问题。我没有使用LDAP的经验,非常感谢您的建议。
谢谢大家!

您是否试图通过这行代码从用户处获取密码?
String pass=(String)entry.get(“密码”).get().toString()

如果是这样,那就不太可能奏效。密码几乎永远无法通过LDAP检索。(异常有点复杂,所以认为不可能)。
您要做的是尝试绑定
solicuser
builded DN和密码值。然后在成功时(密码不是空的,因为它总是成功的,但是作为匿名绑定,所以您必须注意它),您知道您已经通过了身份验证。否则你会失败。您可能希望检查可能的错误消息。不同的LDAP服务器会给出不同的错误。有些用户会报告错误的密码或错误的DN(即没有这样的用户)。其他人没有那么多。

谢谢你的回答!我更改了代码,当我像Worklight Studio中的java应用程序(带有主方法的类)一样运行它时,它就工作了,但当我像Worklight应用程序(在自定义登录模块的登录函数中)一样运行它时,它会打印出相同的错误(jndi.20)。