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

标签 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();  
    }

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

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

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

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

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

最佳答案

您看到的是“未经身份验证的绑定(bind)”,详细信息请参见 LDAP RFC 4513 section 5.1.2并附有关于 section 6.3.1 中后续安全注意事项的注释.

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

关于java - 从 Java(Web 应用程序)针对 Active Directory 2016 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54021767/

相关文章:

java - 使用 LDAP 登录 OpenJDK

java - 打印机中纸张停止 - Java 打印问题

c# - 使用登录名在 Active Directory 中查找用户

java - LDAP 服务器更新和事件通知

PHP LINUX WINDOWS ldap_bind 在 WinXP 上成功,但在 Linux 上不行

php - LDAP 过滤器 - 查找特定 OU 的所有用户

java - 将 SQL 查询输出存储在数组中

java - 在 jboss 上部署 struts 应用程序

java - 如何通过Java中的纬度/经度点计算两条相交线之间的角度?

c# - 如何在 ASP.NET Core 中获取 Active Directory 当前用户显示名称?