通过Java(Web应用程序)针对Active Directory 2016进行身份验证

时间:2019-01-03 11:52:44

标签: java active-directory ldap jndi

我已经设置了AD 2016安装。现在打算将其用于Web应用程序的身份验证(java)。我有一段用于测试身份验证的代码,并且有一些发现。

public static void main(String[] args) 
{  
    String userid="userhere",password="passwordhere";
    LdapContextCreation ldapContxCrtn = new LdapContextCreation();  
    LdapContext ctx = ldapContxCrtn.getLdapContext(userid,password);
    if(ctx==null)
    {System.out.println("Authentication Failed.");}
    else
    {System.out.println("Authentication Successful.");} 
    }  
    public LdapContext getLdapContext(String base, String password)
    {  
        LdapContext ctx = null;  
        try
    { 
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY,  "com.sun.jndi.ldap.LdapCtxFactory");  
            env.put(Context.SECURITY_AUTHENTICATION, "Simple");
            env.put(Context.SECURITY_PRINCIPAL, base);
            env.put(Context.SECURITY_CREDENTIALS, password);
            env.put(Context.PROVIDER_URL, "ldaps://mydomaincontroller:636");
            ctx = new InitialLdapContext(env, null);  
     }
    catch(NamingException nex)
    {  
            //nex.printStackTrace();  
    }

现在,我在以下情况下测试了用户/密码组合-

// First组合,AD中存在user1并且密码正确(测试身份验证绑定)。 字符串userid =“ user1@domain.com”,password =“ user1password”; 预期:身份验证成功。 实际:认证成功。这对我来说很清楚。对于不正确的密码,它将响应正确的消息-身份验证失败。

//第二组合,AD中存在user2,但我们尝试发送的密码为空(测试未经身份验证的绑定) 字符串userid =“ user2@domain.com”,password =“”; 预期:身份验证失败。 实际:认证成功。 如何处理这种情况-我可以在AD中控制它还是必须在代码中处理?

//第三种组合,AD中不存在user3(测试不存在的用户) 字符串userid =“ user3@domain.com”,password =“ somepassword”; 预期:身份验证失败。 实际:认证成功。 如何处理这种情况?用户不存在,甚至不存在。这是广告配置错误吗?

//第四组合,空用户名和密码(测试匿名绑定) 字符串userid =“”,password =“”; 预期:身份验证失败。 实际:认证成功。 如何处理这种情况-我可以在AD中控制它还是必须在代码中处理?

1 个答案:

答案 0 :(得分:1)

您看到的是一个“未经身份验证的绑定”,在LDAP RFC 4513 section 5.1.2中进行了详细说明,并在section 6.3.1中提供了有关后续安全注意事项的说明。

最好用代码进行处理(即,在与目录服务器通信之前,请确保用户名和密码都不为空)。 Windows 2019中添加了禁止未经身份验证的绑定操作的设置-在配置分区中,打开CN=Directory Service, CN=Windows NT, CN=Services, CN=Configuration的属性-找到msDS-Other-Settings属性,然后添加新条目DenyUnauthenticatedBind=1,但是除非您编写的一次性应用程序只能与您拥有的Active Directory一起使用,否则不能安全地假设已经以这种方式配置了其他Active Directory。