使用 PrincipalContext 和 ADLDS 时 LDAP 服务器不可用

The LDAP Server is Unavailable using PrincipalContext and ADLDS

我们正在使用 ADLDS 进行用户管理和身份验证。我们可以毫无问题地成功查询实例。但是,尝试执行 SetPassword 之类的操作将失败,或者如果未设置密码,甚至尝试创建新用户也会失败。只要不是我尝试更新的密码,我就可以成功更新用户。我一直在阅读很多与此相关的不同文章,但没有找到解决方案。发帖看看我是否可以对这个问题有一些新的看法,感谢您的任何意见。

示例

ContextType ctxType = ContextType.ApplicationDirectory; 
string server = "myadldsserver.com"; 
string usersCN = "CN=Users,..."; // container where users reside 
ContextOptions ctxOpts = ContextOptions.SimpleBind;
string uname = "myuser"; 
string pswrd = "mypass"; 

using(var ctx = new PrincipalContext(ctxType, server, usersCN, ctxOpts, uname, pswrd) 
using(var newUser = new UserPrincipal(ctx)) {
    newUser.Name = "newusername"; 
    newUser.Enabled = true; 
    newUser.UserPrincipalName = "newusername"; 
    newUser.Save(); 

    newUser.SetPassword("newuserpassword");  
} 

错误 1

我遇到的第一个问题是,如果我尝试创建一个新的 UserPrincipal 并在没有像上面的示例那样设置密码的情况下调用 Save,我会得到异常 A constraint violation occurred.,其中包含 0000052D: AtrErr: DSID-033807D7, #1:0: 0000052D: DSID-033807D7, problem 1005 (CONSTRAINT_ATT_TYPE), data 2246, Att 9005a (unicodePwd) 的 InnerException 扩展消息

由于这个错误,我尝试在调用 Save 之前移动 SetPassword 以及我在网上找到的其他方法,例如从 UserPrincipal 获取 DirectoryEntry 并尝试调用 SetPassword 但遇到了不同的错误。

错误 2

在调用 UserPrincipal.Save 之前调用 SetPassword,调用保存时,导致错误 The directory property cannot be found in the cache.

请注意,如果我尝试调用 ResetPassword 或获取 DirectoryEntry 并同时调用 Invoke("SetPassword"...

,则会发生相同的错误

错误 3

根据我的研究,大多数情况似乎表明这可能与需要使用安全连接访问 AD LDS 有关。因此,我更改了我的服务器以包含 636 string server = "myadldsserver.com:636" 端口,并将 ContextOptions 更改为 ContextOptions.SimpleBind | ContextOptions.SecureSocketLayer

在构造 PrincipalContext 时进行这些更改我得到以下异常 The server could not be contacted.,内部异常为 The LDAP server is unavailable.,HResult 为 -2146233087

JAVA 和自民党

为了添加一些背景知识,我们确实在较旧的 Java 应用程序中编写了类似的代码。我们正在尝试将其中一些逻辑移植到 C# 中的 .NET 端。 Java 中的代码使用 Java 密钥库,其中包含在 AD LDS 服务器上生成的证书。 Java 应用程序使用 SSL 端口当然没有问题。我们知道服务器似乎配置正确,这只是如何从 .NET 端访问它的问题。

.NET 端是否有等效项,例如 Java 中的 keystore?我们知道可以与服务器建立 SSL 连接。我们也使用 LDP 验证了这一点。

目标

您是否尝试过使用 Microsoft 管理控制台导入证书?

安装证书的两种方式

两者都

  1. Open a cmd.exe console and type "MMC"
  2. File > Add/Remove Snap-In...
  3. Select Certificates, click Add
  4. Choose Computer Account and Local Computer when prompted, then OK...
  5. Certificates should now be showing under Console Root
  6. Certificates > Trusted Root Certification Authorities > Certificates > (right-click) > All Tasks > Import Certificate...
  7. Find the certificate you want to import, click Next and choose defaults (Trusted Root Certification Authorities should already be selected)
  8. Click Next, Finish

(或)

Simply double-click on the .cer file for the certificate in Windows Explorer, click Install Certificate... > Next > select the option to "Place all certificates in following store" > Browse... > Select Trusted Root Certification Authorities. Continue with next until done.


此时您的证书已安装,您应该能够与您的 ADLDS 服务器进行安全通信。