【问题标题】:Error changing password in active directory在活动目录中更改密码时出错
【发布时间】:2019-04-26 07:31:17
【问题描述】:

我目前正在开发一个带有 spring boot 的应用程序。此应用程序的用户是从 MS Active Directory 中读取的。虽然从 AD 读取所有用户并通过 Spring Boot 安全配置进行身份验证工作正常,但我在更改用户密码时遇到了一些麻烦。

我不希望我的应用程序的用户登录到我的域控制器来更改他们的初始密码。所以这应该可以通过应用程序本身来实现。 目前我尝试使用下面的代码,但在尝试时遇到异常:

出现意外错误(类型=内部服务器错误,状态=500)。 [LDAP:错误代码 50 - 00002098:SecErr:DSID-03150F93,问题 4003(INSUFF_ACCESS_RIGHTS),数据 0];嵌套异常是 javax.naming.NoPermissionException:[LDAP:错误代码 50 - 00002098:SecErr:DSID-03150F93,问题 4003(INSUFF_ACCESS_RIGHTS),数据 0];剩余名称 'cn=testing user'

public void changeUserPassword(String username, String oldPassword, String newPassword) {
    byte[] encodedNewPassword = encode(newPassword);
    ModificationItem[] mods = new ModificationItem[1];
    mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("UnicodePwd", encodedNewPassword));

String base = "OU=someOtherOU,OU=someOu,DC=domain,DC=dom";
String userCN = "CN="+username;
String userDN = userCN + "," + base;
    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setUrl("ldap://my-domain.com:389");
    contextSource.setBase(base);
    contextSource.setUserDn(userDN);
    contextSource.setPassword(oldPassword);
    contextSource.afterPropertiesSet();

    LdapTemplate ldapTemplate = new LdapTemplate(contextSource);

    ldapTemplate.modifyAttributes(UserCN, mods);
}

private byte[] encode(String password) {
    String quotedPassword = "\"" + password + "\"";
    char[] unicodePassword = quotedPassword.toCharArray();
    byte[] passwordArray = new byte[unicodePassword.length * 2];
    for (int i = 0; i < unicodePassword.length; i++) {
        passwordArray[i * 2 + 1] = (byte) (unicodePassword[i] >>> 8);
        passwordArray[i * 2] = (byte) (unicodePassword[i] & 0xff);
    }
    return passwordArray;
}

此代码将导致我已经发布的错误。由于我对使用 ldap 协议和活动目录的经验很少,所以我不知道我在这里做错了什么。

我的代码有错误吗? 或者这是否指向活动目录中的一些错误配置? (我在 Active Directory 管理工具中使用“创建新用户”向导的默认值) - 例如:我是否必须为用户提供一些特殊权限?

一些帮助会非常好。

【问题讨论】:

    标签: spring-boot active-directory


    【解决方案1】:

    更改 unicodePassword 时,AD 需要加密连接 LDAPS。 如果您尚未在 AD 上设置 LDAPS,以下 URL 可能会对您有所帮助。

    https://blogs.msdn.microsoft.com/microsoftrservertigerteam/2017/04/10/step-by-step-guide-to-setup-ldaps-on-windows-server/

    【讨论】:

    • 非常感谢您提供的信息。我稍后会阅读链接,但这真的可以帮助我很多! :-)
    • 你好。我现在尝试了您的解决方案,但目前我似乎无法获得证书。如您提供的链接中所述,我使用 ldap 认证工具创建了一个证书。我将其导出并将其添加到 java 认证商店(已安装的 jre 和已安装 jdk 中的 jre。)当我尝试连接到 ldaps://my.dom:636 时,我会和所有的例外时间:[...] 原因:javax.naming.CommunicationException:简单绑定失败:my.dom:636 原因:java.net.SocketException:连接或出站已关闭您有什么建议吗?
    • 添加(评论用完字符):代码与发布的相同,但 ldap url 参数除外
    • 命令“keytool -list -keystore ”是否显示您的 Active Directory 证书?如果是这样,它有您的 AD 服务器的完整计算机名称?
    • 是的,我似乎在这里犯了一些复制和粘贴错误。在犯更多错误之前。放在这里的完整计算机名称是什么?这听起来很愚蠢,我知道,但我在这里有点困惑。它是服务器的实际电脑名称吗? (例如 my-windows-pc) 是域名(例如 my.domain) 是 AD 的 FQDN(例如 mydomain.dom) 还是它们的某种组合?对不起我今天的愚蠢。度过了一个艰难的周末。就这样吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多