使用c# LdapConnection对象更改LDAP中的用户密码

本文关键字:用户 密码 LDAP LdapConnection 对象 使用 | 更新日期: 2023-09-27 18:19:05

我正在使用c#客户端连接到OpenLDAP实例。

我需要验证用户是否输入了正确的旧密码。如果验证成功,我需要用新密码更新它们的"userPassword"属性。

我一直得到DirectoryOperationException: A value in the request is invalid.这是代码:

public static void UpdateUserPassword(ref UserProfile user, string oldPassword, string newPassword) {
        string connAccountName = ControllerHelper.GetProperty("VSP_SECURITY_PRINCIPAL", true);
        string connAccountPassword = ControllerHelper.GetProperty("VSP_SECURITY_CREDENTIALS", true);
        int myConnectionId;
        LdapConnection ldapConnection;
        lock (_sConnectionTable.SyncRoot) {
            myConnectionId = _getFirstOpenConnectionId();
            ldapConnection = _getConnectionFromPool(ref myConnectionId);//check for null
        }

        try {
            /*Here is where I try to validate the user's old password*/
            ldapConnection.Bind(new NetworkCredential(user.dnName, oldPassword));
            ModifyRequest request = new ModifyRequest(
                    user.dnName,
                    DirectoryAttributeOperation.Replace,
                    "userPassword",
                    newPassword
                );
            ModifyResponse modResponse = (ModifyResponse)ldapConnection.SendRequest(request);
            user.state.successMsg = "Yay it worked!";
        }
        catch (Exception e) {
            user.state.errorMsg = e.Message;
        }
        finally {
            _releaseConnectionToPool(myConnectionId);
        }
    }

任何帮助都会很感激。谢谢!

使用c# LdapConnection对象更改LDAP中的用户密码

我认为ModifyRequest的最后一个参数在你正在使用的期望对象数组,你只是传递一个单一的值,这可能会导致你的错误。

我将使用这个而不是你的ModifyRequest行

DirectoryAttributeModification modifyUserPassword = new DirectoryAttributeModification();
modifyUserPassword.Operation = DirectoryAttributeOperation.Replace;
modifyUserPassword.Name = "userPassword";
modifyUserPassword.Add(newPassword);
ModifyRequest modifyRequest = new ModifyRequest(user.dnName, modifyUserPassword);

在。net框架3.5及更高版本中,你可以使用System.DirectoryServices.AccountManagement,这会大大简化事情。
下面的例子可能会解决你的问题

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    // find a user
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");
    if(user != null)
    {
        user.ChangePassword(oldPassword, newPassword);
        user.UnlockAccount();
    }
}