【问题标题】:Compare old password against an active directory using LDAP Spring使用 LDAP Spring 将旧密码与活动目录进行比较
【发布时间】:2021-11-23 22:42:56
【问题描述】:

我创建了一个端点来更新我们 Active Directory 中用户的密码 使用 LDAP 弹簧。 在不检查之前的密码是否匹配的情况下更改它没有问题,但我需要以某种方式检查之前的密码是否与当前在活动目录中的密码相同。

我的代码现在给我这个错误:

LDAP: error code 19 - 0000216C: AtrErr: DSID-03190F1E, 
#1:\n\t0: 0000216C: DSID-03190F1E, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 9005a (unicodePwd)

我的密码更新代码如下:

public void updateUserPassword(User user,String oldPassword, String newPassword) throws NameNotFoundException, UnsupportedEncodingException {
    Attribute oldattr = new BasicAttribute("unicodePwd", toUnicodeBytes(oldPassword);
    Attribute newattr = new BasicAttribute("unicodePwd", toUnicodeBytes(newPassword);
    ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
    ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
    ldapTemplate.modifyAttributes(buildDn(user), new ModificationItem[] { olditem, newitem });
}

public static byte[] toUnicodeBytes(String password){
    String quotedPassword = "\"" + password + "\"";
    char unicodePwd[] = quotedPassword.toCharArray();
    byte pwdArray[] = new byte[unicodePwd.length * 2];
    for (int i = 0; i < unicodePwd.length; i++)
    {
        pwdArray[i * 2 + 1] = (byte) (unicodePwd[i] >>> 8);
        pwdArray[i * 2 + 0] = (byte) (unicodePwd[i] & 0xff);
    }
    return pwdArray;
}

下面的代码有效,但是我想验证之前的密码是否正确,所以不能使用。

public void updateUserPassword(User user,String oldPassword, String newPassword) throws NameNotFoundException, UnsupportedEncodingException {
    Attribute attr = new BasicAttribute("unicodePwd",toUnicodeBytes(newPassword));
    ModificationItem item = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attr);
    ldapTemplate.modifyAttributes(buildDn(user), new ModificationItem[] { item });
}

关于如何解决问题的任何想法?提前致谢。

【问题讨论】:

  • 与您测试的用户是否真的有权更改自己的密码?
  • 是的,是管理员用户。

标签: java spring active-directory ldap


【解决方案1】:

这可能不是您的问题,因为您说重置密码有效,但值得一提:

要更改或重置密码,连接必须是安全的。详情here.

您可以通过连接到端口 636 来执行此操作,该端口是默认 LDAPS 端口(LDAP over SSL)。这可以通过在 LDAP 连接字符串中指定端口来完成,例如"LDAP://example.com:636"。一些 LDAP 库可能支持使用"LDAPS://example.com" 来实现相同的目的。

由于某些服务器使用自签名证书,默认情况下不会被信任。所以你可能会遇到问题。但如果需要,请搜索“Java LDAPS”以获取帮助。

【讨论】:

  • 我在整个过程中都使用 ldaps,所以我认为这不是问题。
  • 可能是密码策略?
  • @Rusty23 有可能
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2020-09-21
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多