【问题标题】:How do I resolve "WILL_NOT_PERFORM" MS AD reply when trying to change password in scala w/ the unboundid LDAP SDK?尝试使用 unboundid LDAP SDK 在 Scala 中更改密码时,如何解决“WILL_NOT_PERFORM”MS AD 回复?
【发布时间】:2011-07-23 02:57:38
【问题描述】:

我正在与 Active Directory 搏斗,试图让它让我更改密码。我找到了大量有用的信息,但我仍然遇到持续错误。

一些代码:

import com.unboundid.ldap.sdk._
import com.unboundid.util.ssl._


def main(args: Array[String]) : Unit = {

var sslUtil = new SSLUtil( new TrustAllTrustManager() )
var con = new LDAPConnection(sslUtil.createSSLSocketFactory())
con.connect("ldap.example.net", 636)
con.bind("ldapadmin", "adminpasswd")
val newPass = "Jfi8ZH8#k".getBytes("UTF-16LE");
val modRequest = new ModifyRequest("dn: cn=Tester Dude,ou=Lab,ou=Org,ou=Provider,DC=example,DC=net",
  "changetype: modify",
  "replace: unicodePwd",
  "unicodePwd: " + '"' + newPass + '"')

println("\nGoing to try to set password to " + newPass + " with: " + modRequest.toString())

try {
  con.modify(modRequest)
} catch {
  case lde:LDAPException => println("failed LDAPException: " + lde.toString())
}

}

所以,我认为这是一个运行时错误:

将尝试将密码设置为 [B@6dd1627e 与: ModifyRequest(dn='cn=Tester Dude,ou=Lab,ou=Org,ou=Provider,DC=example,DC=net', mods={替换 unicodePwd})

LDAPException 失败:LDAPException(resultCode=53 (不愿意执行), errorMessage='0000001F: SvcErr: DSID-031A11E5, 问题 5003 (WILL_NOT_PERFORM), 数据 0 ', diagnosticMessage='0000001F: SvcErr: DSID-031A11E5, 问题 5003 (WILL_NOT_PERFORM), 数据 0 ')

所以在我所知道的可能导致此错误的事情中:

  1. 未通过 SSL 连接。 (这里不是这种情况,我已经使用 netstat 100% 确定我在端口 636 上)
  2. 传递的密码违反了 Active Directory 密码策略。 (我已经测试过手动设置该确切密码;它会拒绝短/简单密码,但它接受我在此代码中使用的密码)

我已经尝试过在密码周围加引号和不加引号。

迄今为止最有用的信息来源是:

http://www.dirmgr.com/blog/2010/8/26/ldap-password-changes-in-active-directory.html

但我已经用尽了那里(以及许多其他地方)的所有建议。

我还尝试了其他几件事,包括为手动添加的其他有效用户设置密码。 (这个也是通过 sdk 添加的。)

其他操作正常。我已经删除了不相关的代码,但我能够毫无问题地搜索、打印属性、添加和删除用户;但此修改请求失败。如果我将 ModifyRequest 设置为更改其他一些属性,例如关联的电子邮件,那也可以正常工作。

【问题讨论】:

    标签: java scala active-directory ldap unboundid-ldap-sdk


    【解决方案1】:

    连接不够安全

    引用自:http://support.microsoft.com/kb/269190

    为了修改此属性,客户端必须与服务器建立 128 位安全套接字层 (SSL) 连接。

    因此,即使其他一切看起来都正确,如果连接被认为不安全,您仍然可能会收到 SvcErr: DSID-03190F4C, problem 5003 (WILL_NOT_PERFORM)

    缺乏管理员权限

    如果您尝试在没有足够权限的情况下执行replace,则修改请求可能会失败。

    dn: CN=johndoe,OU=Users,DC=example,DC=com
    changetype: modify
    replace: unicodePwd
    unicodePwd:: base64(utf16le(quoted(password)))
    -
    

    在这种情况下,您将收到SecErr: DSID-03150E47, problem 4003 (INSUFF_ACCESS_RIGHTS)。如果您尝试使用非特权帐户bind,就会发生这种情况。

    密码历史

    一些管理员喜欢拥有较长的密码历史记录(例如,保存最后 24 个密码)。如果您使用已在历史记录中的旧密码,您将收到 CONSTRAINT_ATT_TYPE

    普通用户

    1. 保护连接

    2. 使用delete-add 组合。

    例如

    dn: CN=johndoe,OU=Users,DC=example,DC=com
    changetype: modify
    delete: unicodePwd
    unicodePwd:: base64(utf16le(quoted(old password)))
    -
    add: unicodePwd
    unicodePwd:: base64(utf16le(quoted(new password)))
    -
    

    【讨论】:

      【解决方案2】:

      原来它必须是UTF-16LE编码,然后转成base64。

      val newPass = javax.xml.bind.DatatypeConverter.printBase64Binary(('"'+"Jfi8ZH8#k"+'"').getBytes("UTF-16LE"))
      

      成功了。

      【讨论】:

        【解决方案3】:

        我的猜测是 "unicodePwd: " + '"' + newPass + '"' 绕过了您的编码(因为 String 必须再次转换为字节,我敢打赌它没有使用正确的编码)。

        尝试使用采用Modification 对象的MofifyRequest 版本,然后使用将属性值作为字节的构造函数。

        val newPass = "\"Jfi8ZH8#k\"".getBytes("UTF-16LE")
        // note the dquotes inside the string
        
        val mod = new Modification(ModificationType.REPLACE, "unicodePwd", newPass)
        

        就像在您链接到的博客文章中一样...

        【讨论】:

        • 原来必须是UTF-16LE编码,然后转成base64。 val newPass = javax.xml.bind.DatatypeConverter.printBase64Binary(('"'+"Jfi8ZH8#k"+'"').getBytes("UTF-16LE")) 成功了。将在可能的情况下将其发布为答案。
        【解决方案4】:

        我也偶然发现了这个问题。我正在为 C# 使用 Novell.Directory.Ldap.NETStandard 库。我的问题是需要引用密码。这段代码对我有用:

        var passwordBytes = Encoding.Unicode.GetBytes($"\"{newPassword}\"");
        connection.Modify(userDn, new LdapModification(LdapModification.Replace, new LdapAttribute("unicodePwd", passwordBytes)));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多