【问题标题】:The LDAP Server is Unavailable using PrincipalContext and ADLDSLDAP 服务器使用 PrincipalContext 和 ADLDS 不可用
【发布时间】:2017-05-10 15:57:38
【问题描述】:

我们正在使用 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,在调用save时会报错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 和 LDP

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

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

目标

  • 能够创建新用户并在创建过程中设置密码
  • 能够为用户重置密码或更改密码
  • 从 .NET 安全地连接到我们的 AD LDS 实例

【问题讨论】:

    标签: c# directoryservices userprincipal principalcontext adlds


    【解决方案1】:

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

    安装证书的两种方式

    要么

    1. 打开 cmd.exe 控制台并输入“MMC”
    2. 文件 > 添加/删除管理单元...
    3. 选择证书,点击添加
    4. 出现提示时选择计算机帐户和本地计算机,然后确定...
    5. 证书现在应该显示在控制台根目录下
    6. 证书 > 受信任的根证书颁发机构 > 证书 >(右键单击)> 所有任务 > 导入证书...
    7. 找到您要导入的证书,单击下一步并选择默认值(受信任的根证书颁发机构应该已经是 选择)
    8. 点击下一步,完成

    (或)

    在 Windows 中只需双击证书的 .cer 文件 资源管理器,单击安装证书... > 下一步 > 选择选项 “将所有证书放在以下商店中”> 浏览... > 选择 受信任的根证书颁发机构。继续下一步直到完成。


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

    【讨论】:

    • 感谢 @Mindwalker2076 这对我有用。我假设我必须在每台需要使用 .NET 代码访问 AD LDS 服务器的机器上执行此操作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多