C# LDAP 用户更改密码失败。 SSL连接是必须的吗?

Posted

技术标签:

【中文标题】C# LDAP 用户更改密码失败。 SSL连接是必须的吗?【英文标题】:C# LDAP user change password failed. Is SSL connection must? 【发布时间】:2022-01-17 14:54:22 【问题描述】:

我正在编写一个 ASP.NET Core 5 Web API(独立于平台)来更改 LDAP 用户密码。我正在使用库Novell.Directory.Ldap

这是我的代码:

var ldapHost = "192/168.*.*";
var loginDN = "CN=something,DC=something";   //loginDn of the user itself or admin 
var opassword = "Abcd@11111111";  //oldpassword
var npassword = "Xyzw@22222222";  //newpassword
npassword =  '"' + npassword + '"';

LdapConnection conn = new LdapConnection();

Console.WriteLine("Connecting to:" + ldapHost);

conn.Connect(ldapHost, LdapConnection.DefaultPort);
conn.Bind(loginDN, opassword);

LdapModification[] modifications = new LdapModification[2];
LdapAttribute deletePassword = new LdapAttribute("userPassword", opassword);
modifications[0] = new LdapModification(LdapModification.Delete, deletePassword);

LdapAttribute addPassword = new LdapAttribute("userPassword", npassword);
modifications[1] = new LdapModification(LdapModification.Add, addPassword);

conn.Modify(loginDN, modifications);

我正在为 Windows AD 域以及 Linux OpenLDAP 测试此代码。两个 LDAP 服务器的用户都具有属性属性 userPassword

当我运行此代码时,LdapModification.ADD 会抛出一个错误,No such attribute userPassword. 当我尝试找到解决方案时,我让人们使用属性 unicodePwd,但它需要 SSL 连接。

对于 AD 域和 Open LDAP,SSL 连接是必须吗?或者如何解决上述错误?请帮忙。

【问题讨论】:

是的,对于 AD,您需要 SSL 才能使用 LDAP 更改密码,这里还有其他方法。 docs.microsoft.com/en-us/troubleshoot/windows-server/identity/… 。我还没有与 OPENLdap 合作过...希望对您有所帮助 但是当我使用System.DirectoryServicesChangePassword方法时,没有SSL连接是可能的。 System.DirectoryServices 可能正在使用其他方式/协议之一来更改密码,有 6 种,除了 LDAP 之外,它们都不需要 SSL,如 microsoft 页面上所述 【参考方案1】:

虽然 AD 具有 userPassword 属性,但它只是指向 unicodePwd 属性的指针,这是真正的密码属性。但是userPassword 并不总是有效,如the documentation 中所述。对于 Active Directory,您最好直接使用unicodePwd

The documentation for unicodePwd 表示您需要 SSL 或 SASL 加密来设置属性。 SASL 通常使用 Kerberos 完成。如果您使用的是DirectoryEntry,则可以通过指定AuthenticationTypes.Sealing 轻松完成。对于Novell.Directory.Ldap,我不知道这是否可能,而this open issue 建议它不是(还)。

除非您愿意改用 Sytem.DirectoryServices(在 .NET Core 中,这会锁定您只能在 Windows 上运行您的应用程序),否则我认为您需要 SSL。

unicodePwd 属性还需要非常具体的格式。文档说:

DC 要求在 UTF-16 编码的 Unicode 字符串中指定密码值,该字符串包含用引号括起来的密码,根据 Object(Replica-Link) 语法,该字符串已被 BER 编码为八位字节字符串。

在 C# 中,这很容易做到:

Encoding.Unicode.GetBytes("\"NewPassword\"")

【讨论】:

感谢您的回答。所以我接下来应该在 AD 域和 OpenLDAP 上启用 SSL。 你好,我可以成功更新windows AD域用户密码了。但是对于 OpenLDAP,它在 conn.Modify 上给出错误,即 no such attribute unicodePwd 。 OpenLDAP 是否为 userPassword 使用了一些不同的属性? @Versh OpenLDAP 可能使用userPassword。您必须区别对待 AD 和 OpenLDAP。

以上是关于C# LDAP 用户更改密码失败。 SSL连接是必须的吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 LDAP/PHP/IIS/SSL 在 Active Directory 中更改密码

java 连接 ldap 报错

JAVA连接LDAP(Windows AD)验证时,密码为空验证通过的问题?

C# OpenLDAP 错误:unicodePwd:属性类型未定义

使用 LDAP 的 Alfresco,在 Alfresco 接口中更改用户的密码

Ansible - 在ldap服务器上更改用户密码