使用JAAS LdapLoginModule通过ActiveDirectory进行身份验证时遇到FailedLoginException

时间:2016-04-11 12:18:56

标签: java authentication active-directory ldap jaas

我拔出头发试图让LDAP身份验证与Active Directory一起使用。

我们刚刚设置了一个SharePoint Server 2010,我们认为最好还是针对Active Directory对用户进行身份验证,因为它已经存在于SharePoint中。我们的环境是Windows Server 2008 R2 Standard。

我有一位用户名为ahsieh@rdl.com.tw enter image description here

的用户

根据这个回答https://serverfault.com/a/130556我的提供者URL应该是ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw(注意,我没有使用vm-sps.rdl.com.tw的主机名,而是选择使用IP地址因为我没有时间为所述服务器配置DNS条目)

为了确保,我在服务器上运行了dsquery命令:enter image description here

但是,我无法获得身份验证工作。我按照LdapLoginModule API

尝试了所有三种类型的JAAS配置

以下是我遇到的错误:

1。搜索优先模式:

注意:我没有指定authzIdentity,因为我没有在AD上设置

JAAS配置:

AESLogin_AD1 {
    com.sun.security.auth.module.LdapLoginModule REQUIRED
    userProvider="ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw"
    userFilter="(&(uid={USERNAME})(objectClass=User))"
    useSSL=false
    debug=true;
};

结果:

        [LdapLoginModule] search-first mode; SSL disabled
        [LdapLoginModule] user provider: ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw
        [LdapLoginModule] searching for entry belonging to user: ahsieh@rdl.com.tw
        [LdapLoginModule] authentication failed
        [LdapLoginModule] aborted authentication
javax.security.auth.login.FailedLoginException: Cannot find user's LDAP entry

2。身份验证优先模式

JAAS配置:

AESLogin_AD2 {
    com.sun.security.auth.module.LdapLoginModule REQUIRED
    userProvider="ldap:///CN=Users,DC=rdl,DC=com,DC=tw"
    authIdentity="{USERNAME}"
    userFilter="(&(|(samAccountName={USERNAME})(userPrincipalName={USERNAME})(cn={USERNAME}))(objectClass=user))"
    useSSL=false
    debug=true;
};

结果:

        [LdapLoginModule] authentication-first mode; SSL disabled
        [LdapLoginModule] user provider: ldap:///CN=Users,DC=rdl,DC=com,DC=tw
        [LdapLoginModule] attempting to authenticate user: ahsieh@rdl.com.tw
        [LdapLoginModule] authentication failed
        [LdapLoginModule] aborted authentication
javax.security.auth.login.FailedLoginException: Cannot bind to LDAP server

第3。仅验证模式

注意:我没有指定authzIdentity,因为我没有在AD上设置

JAAS配置:

AESLogin_AD3 {
    com.sun.security.auth.module.LdapLoginModule REQUIRED
    userProvider="ldap://192.168.0.81:389"
    authIdentity="CN={USERNAME},CN=Users,DC=rdl,DC=com,DC=tw"
    useSSL=false
    debug=true;
};

结果:

        [LdapLoginModule] authentication-only mode; SSL disabled
        [LdapLoginModule] user provider: ldap://192.168.0.81:389
        [LdapLoginModule] attempting to authenticate user: ahsieh@rdl.com.tw
        [LdapLoginModule] authentication failed
        [LdapLoginModule] aborted authentication
javax.security.auth.login.FailedLoginException: Cannot bind to LDAP server

我还尝试了另一个基于我在互联网上遇到的例子的配置:

4。来自其他示例的配置

JAAS配置:

AESLogin_AD4 {
    com.sun.security.auth.module.LdapLoginModule REQUIRED
    userProvider="ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw"
    authIdentity="{USERNAME}"
    useSSL=false
    debug=true;
};

结果:

        [LdapLoginModule] authentication-only mode; SSL disabled
        [LdapLoginModule] user provider: ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw
        [LdapLoginModule] attempting to authenticate user: ahsieh@rdl.com.tw
        [LdapLoginModule] cannot create LdapPrincipal: bad DN
        [LdapLoginModule] authentication failed
        [LdapLoginModule] aborted authentication
javax.security.auth.login.FailedLoginException: Cannot create LdapPrincipal

注意:我的第四次试验似乎略有进展,因为至少LDAP绑定似乎有效,但现在问题似乎是cannot create LdapPrincipal: bad DN

我已经进入了LdapLoginModule的源代码,并且通过匹配调试消息,似乎这是由(从第837行开始)引起的:

try {

    ldapPrincipal = new LdapPrincipal(dn);

} catch (InvalidNameException e) {
    if (debug) {
        System.out.println("\t\t[LdapLoginModule] " +
                           "cannot create LdapPrincipal: bad DN");
    }
    throw (LoginException)
        new FailedLoginException("Cannot create LdapPrincipal")
            .initCause(e);
}

根据LdapPrincipal APIInvalidNameException被抛出如果检测到语法违规,但我不知道语法违规在哪里。

我也不知道如何调试它。

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:3)

我已经在网上浏览了更多文章,最后找到了Bonitasoft&Q& A JAAS config for Active Directory LDAP

的解决方案

JAAS配置:

AESLogin_ADx {
    com.sun.security.auth.module.LdapLoginModule REQUIRED
    userProvider="ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw"
    authIdentity="{USERNAME}@rdl.com.tw"
    userFilter="(&(|(samAccountName={USERNAME})(userPrincipalName={USERNAME})(cn={USERNAME}))(objectClass=user))"
    useSSL=false
    debug=true;
};

<强>结果:

[LdapLoginModule] authentication-first mode; SSL disabled
[LdapLoginModule] user provider: ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw
[LdapLoginModule] attempting to authenticate user: ahsieh
[LdapLoginModule] searching for entry belonging to user: ahsieh
[LdapLoginModule] found entry: CN=Arthur Hsieh,CN=Users,DC=rdl,DC=com,DC=tw
[LdapLoginModule] authentication succeeded
[LdapLoginModule] added LdapPrincipal "CN=Arthur Hsieh,CN=Users,DC=rdl,DC=com,DC=tw" to Subject
[LdapLoginModule] added UserPrincipal "ahsieh" to Subject