目前,我开发了一个Java WebApplication,可以更改AD控制的密码。 WebApplication使用LDAP访问来执行此操作。用户需要进行身份验证,然后将其密码更改为“LdapContext.modifyAttributes()” - 方法。
现在我意识到这对使用初始密码的用户不起作用。初始密码表示标志“pwdLastSet”设置为要求下次登录时更改密码。
这就是它现在如何运作。
prop.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
prop.put(Context.PROVIDER_URL, "ldaps://my.active.directory.com:636");
prop.put(Context.SECURITY_AUTHENTICATION, "simple");
prop.put(Context.SECURITY_PROTOCOL,"ADSecurityProtocol");
prop.put(Context.SECURITY_PRINCIPAL,this.userid);
prop.put(Context.SECURITY_CREDENTIALS,password);
ldapContext = new InitialLdapContext(prop, null);
<...snip...>
ModificationItem[] mods = new ModificationItem[2];
String oldQuotedPassword = "\"" + oldPassword + "\"";
byte[] oldUnicodePassword = oldQuotedPassword.getBytes("UTF-16LE");
String newQuotedPassword = "\"" + newPassword1 + "\"";
byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");
mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,
new BasicAttribute("unicodePwd", oldUnicodePassword));
mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE,
new BasicAttribute("unicodePwd", newUnicodePassword));
ldapContext.modifyAttributes(userDN, mods);
我正在寻找一个如何让用户更改密码的想法,尤其是在他们需要时。我发现了一些可能需要Kerberos的提示 - 但我几乎对Kerberos一无所知。
感谢任何帮助。
乌尔里希
答案 0 :(得分:0)
我没有完全明白这个问题。设置pwdLastSet时粘贴的代码不起作用?或者您正在寻找让用户知道他们必须改变他们的pwd的想法?
如果代码不起作用,您是否尝试过DirContext.REPLACE_ATTRIBUTE?
如果您需要一种方法让用户知道,只需捕获异常并在ui上显示错误信息。
答案 1 :(得分:0)
尝试使用Apache LDAP API,它似乎比纯JNDI更容易。
我做了一篇关于它的博客文章,但是使用了AWS Simple AD实现。我可能会有用: http://blog.techutils.space/2016/02/changing-samba4-aws-simple-ad-user.html