繁体   English   中英

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

[英]Authenticating against Active Directory 2016 from Java(web applications)

我已经设置了 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();  
    }

现在我在以下场景中测试了用户/密码组合 -

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

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

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

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

您看到的是“未经身份验证的绑定”,在LDAP RFC 4513 第 5.1.2 节中有详细说明,并附有关于第 6.3.1 节中后续安全注意事项的注释。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM