我已经设置了 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/