我使用java和spring在AD LDAP中创建新的用户帐户。 对于此任务,需要设置密码属性。我遵循AD中的所有已知规则: unicodePwd 属性通过SSL连接以UTF-16LE格式使用密码周围的引号发送。
几天来我几乎都在尝试过。进程运行时不会抛出异常。当我使用Apache Directory检查新用户帐户时,它会显示密码创建的时间戳(属性 pwdLastSet )。所以,密码存在(?)。 但最糟糕的是我无法验证我创建的任何用户,但我可以使用相同的代码更改已存在的用户的密码。此用户可以使用新的密码进行身份验证(非常罕见)。
我怀疑在创建新用户时我遗漏了一些属性。
此外,当我尝试使用我之前设置的密码以编程方式验证新用户时, badPwdCount 属性从不递增(它保持为0)。但是这个属性实际上会增加如果我尝试使用任何其他密码值进行身份验证(这是非常非常的,但正在发生)。
这些是我设置的属性:
这是设置密码的代码
public void setPass(Exchange ex) throws UnsupportedEncodingException, NoSuchAlgorithmException {
final String PASS = '"' + "Nuevo.password1" + '"';
String dn = (String) ex.getIn().getHeader("dn");
byte[] quotedBytes = PASS.getBytes("UTF-16LE");
LdapTemplate ldap = (LdapTemplate) ex.getContext().getRegistry().lookup("ldapWrite") ;
Attribute pass = new BasicAttribute("unicodePwd", quotedBytes);
ModificationItem item = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, pass);
ldap.modifyAttributes(dn, new ModificationItem[] { item });
}
这是LDAP bean的spring配置。
<bean class="org.springframework.ldap.core.support.LdapContextSource" id="ctxSource">
<property name="url" value="ldaps://10.228.193.134:636" />
<property name="userDn" value="CN=Integración AGS,OU=Usuarios,OU=Cuentas de Servicio,OU=Regionales,DC=dssatuat,DC=sat,DC=gob,DC=mx" />
<property name="password" value="Octubre.14" />
</bean>
<bean class="org.springframework.ldap.core.LdapTemplate" id="ldapWrite">
<constructor-arg ref="ctxSource" />
</bean>