使用PrincipalContext和ADLDS

时间:2017-05-10 15:57:39

标签: c# directoryservices userprincipal principalcontext 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,当调用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验证了这一点。

目标

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

1 个答案:

答案 0 :(得分:3)

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

安装证书的两种方法

无论

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

(或)

  

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

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