【问题标题】:Can I change myself Active Directory password from LDAP (without administrative account)我可以从 LDAP 更改自己的 Active Directory 密码吗(没有管理帐户)
【发布时间】:2012-03-14 10:15:41
【问题描述】:

我没有(也不会)拥有管理员帐户。 我想从 java 更改 Active Directory 中的自己(用户)密码。 我该怎么做?

使用来自网络的代码:

private void changePass() throws Exception {
    String oldpass = this.encodePassword("oldpass!");
    String newpass = this.encodePassword("newpass!");
    Attribute oldattr = new BasicAttribute("unicodePwd", oldpass);
    Attribute newattr = new BasicAttribute("unicodePwd", newpass);
    ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
    ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
    ModificationItem repitem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, newattr);
    ModificationItem[] mods = new ModificationItem[2];
    mods[0] = olditem;
    mods[1] = newitem;
    // ldapTemplate.modifyAttributes("cn=administrator,cn=Users", mods);
    ldapTemplate.modifyAttributes("cn=smith,cn=Users", new ModificationItem[] { repitem });
}

这里是上下文来源

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="url" value="ldap://ldapserver:389"/>
    <property name="base" value="dc=company,dc=com"/>
    <property name="userDn" value="smith@company"/>
    <property name="password" value="oldpass"/>
</bean>

我明白了:

LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:
'CN=Users,DC=company,DC=com'

如果我将 userDn 更改为“cn=smith”,我得到:

LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误

也许我的问题是我不明白 LDAP 是如何工作的?是否可以(使用用户帐户更改用户密码)? 而且,如果可能的话,我可以使用相同的权限检查帐户锁定/过期吗?

更新/解决

非常感谢您的帮助。这对我也很有帮助。

对于未来的搜索者:

NO_OBJECT - 表示 Active Directory 找不到对象(my cn=Users,cn=Smith) 要找到用户目录的完全限定规范路径,您可以使用用户属性“distinguishedName”(在我的最坏情况下,它是“cn=John\, Smith”,ou=Contractors,ou=用户帐户,ou=Accounts")

然后我得到了:

WILL_NOT_PERFORM - 这可能意味着不同类型的事情。在我的情况下,对象类型有误,但可能还有其他情况,如下所述 - 不是 SSL 连接 (not ldaps://) 等等。

然后:

INSUFF_ACCESS_RIGHTS - 用户(不是管理员没有权限替换密码属性),要更改密码,他必须输入旧密码和新密码,然后删除旧密码并添加新密码。

Attribute oldattr = new BasicAttribute("unicodePwd", oldQuotedPassword.getBytes("UTF-16LE"));
Attribute newattr = new BasicAttribute("unicodePwd", newQuotedPassword.getBytes("UTF-16LE"));
ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
ldapTemplate.modifyAttributes("cn=John\\, Smith,ou=Contractors,ou=User Accounts,ou=Accounts", new ModificationItem[] { olditem, newitem });

问题 1005 (CONSTRAINT_ATT_TYPE) - 如果旧密码错误

顺便说一句

javax.naming.PartialResultException:未处理的继续引用; remaining name '/' - 在全局搜索个人/用户时(例如,在身份验证方法中) ldapTemplate.setIgnorePartialResultException(true);可以解决的

【问题讨论】:

    标签: java active-directory ldap spring-ldap


    【解决方案1】:

    是的,你可以,但这有点棘手。

    首先要更改密码,您必须通过 LDAPS 而不是 LDAP 进行连接。那就是使用 TLS 或 SSL(至少 128 位)连接。这是一个如何使用JNDI 完成此操作的示例。

    其次,您必须将密码作为 UTF-16LE 编码的字节数组传递。但在编码之前,你应该用双引号将它括起来。所以这里是一个例子:

    String pass = "\"" + "newpass" + "\"";
    byte[] password = pass.getBytes("UTF-16LE");
    // You will need to handle UnsupportedEncodingException here
    

    【讨论】:

      【解决方案2】:
      1. 如果 cn=smith,cn=Users 不是条目的真实 DN,则它必须是。

      2. 您不需要所有删除/添加/替换的东西:只需使用 REPLACE_ATTRIBUTE; 如果您正在使用管理帐户更改密码。

        如果您以自己的身份更新密码,即绑定到您要更新的同一帐户,则确实需要它。原因是您必须提供用于删除的旧密码和用于插入的新密码,以便可以检测到旧密码的匹配失败。或者,您可以使用扩展的密码修改操作,其中再次提供旧密码和新密码。

      【讨论】:

      • 非常感谢,我将代码修复为 getContext().modifyAttributes("cn=Users", new ModificationItem[] { new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("unicodePwd", encodePassword( "mamakassa22!").getBytes("UTF-16LE"))) });和 cn=Users,现在我得到了 SvcErr: DSID-03190C6B,问题 5003 (WILL_NOT_PERFORM),数据 0。可能问题出在非 SSL 连接上?
      • @JohnSmith 我相信 WILL_NOT_PERFORM 意味着它需要比目前更多的安全性。如果您有 API,您还应该考虑使用扩展密码修改操作,而不仅仅是此属性更改。
      • 如果您在更改密码属性时使用非管理员用户进行身份验证,则确实需要删除/添加内容。在这种情况下没有简单的 REPLACE_ATTRIBUTE。
      • @Johanneke 同意,我对 (b) 有误:见编辑。
      猜你喜欢
      • 2012-06-26
      • 2019-12-12
      • 2015-09-11
      • 2021-08-27
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多