2012-02-06 33 views
0

我使用下面的代码来验证属于我们公司域的用户。这工作正常。如何验证Windows用户?

using (var entry = new DirectoryEntry("")) 
{ 
    DirectorySearcher ds = new DirectorySearcher(entry); 

    ds.Filter = "(|(&(objectCategory=user)(name=domainuser)))"; 
    ds.PropertyNamesOnly = true; 
    ds.PropertiesToLoad.Add("name"); 
    ds.ReferralChasing = ReferralChasingOption.None; 

    SearchResultCollection src = ds.FindAll(); 

    bool isValid = false; 
    try 
    { 
     foreach (SearchResult sr in src) 
     { 
      DirectoryEntry de = sr.GetDirectoryEntry(); 
      de.Password = "domainpassword"; 
      object nativeObject = de.NativeObject; 


      if (nativeObject != null) 
       isValid = true; 

      break; 
     } 
    } 
    catch (DirectoryServicesCOMException ex) {} 

    return isValid; 
} 

实际的问题是,我需要在我的笔记本电脑(MYINSTANCE)来创建一个LDAP实例,然后我需要以编程方式创建用户。我能够创建用户并遍历它们。

现在对于这样的用户,我无法验证用户名和密码。

我做的改变如下。

using (var entry = new DirectoryEntry("LDAP://MYPC:389/CN=MYINSTANCE,DC=COMPANYDOMAIN,DC=com", "domainuser", "domainpassword", AuthenticationTypes.Secure)) 
{ 
    DirectorySearcher ds = new DirectorySearcher(entry); 

    ds.Filter = "(|(&(objectCategory=user)(name=instanceuser)))"; 
    ds.PropertyNamesOnly = true; 
    ds.PropertiesToLoad.Add("name"); 
    ds.ReferralChasing = ReferralChasingOption.None; 

    SearchResultCollection src = ds.FindAll(); 

    bool isValid = false; 
    try 
    { 
     foreach (SearchResult sr in src) 
     { 
      DirectoryEntry de = sr.GetDirectoryEntry(); 
      de.Password = "instancepassword"; 
      object nativeObject = de.NativeObject; 


      if (nativeObject != null) 
       isValid = true; 

      break; 
     } 
    } 
    catch (DirectoryServicesCOMException ex) {} 

    return isValid; 
} 

回答

0

如果你在.NET 3.5或更高版本,则可以使用System.DirectoryServices.AccountManagement命名空间,轻松地验证您的凭据:

// create a "principal context" - e.g. your domain (could be machine, too) 
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "MYINSTANCE", 
           "CN=MYINSTANCE,DC=COMPANYDOMAIN,DC=com", 
           ContextType.SecureSocketLayer, 
           "domainuser", "domainpassword") 
{ 
    // validate the credentials 
    bool isValid = pc.ValidateCredentials("myuser", "mypassword"); 
} 

很简单,它是可靠的,它是100%C#托管代码在你结束 - 你还能要求什么? :-)

阅读所有关于它在这里:

+0

当我使用此代码,我碰到下面的错误。 “服务器无法联系。”当我使用(PrincipalContext pc =新的PrincipalContext(ContextType.Domain,“COMPANYDOMAIN”,“CN = MYINSTANCE,DC = COMPANYDOMAIN,DC = com”,ContextOptions.SimpleBind,“domainuser”,“domainpassword”)现在我不 – 2012-02-06 12:41:00

+0

@BerylWilson:你说你在你的笔记本电脑上创建了一个LDAP实例?这是否意味着你正在使用AD LDS(活动目录 - 轻量级目录服务)?我相信这是一个错误,但它总是返回false。 AD LDS不能用于身份验证.... – 2012-02-06 14:13:16

+0

感谢您的快速响应,您是对的,我遵循此链接http://bartdesmet.net/blogs/bart/archive/2010/07/12/getting-如果AD LDS不能用于身份验证,是否可以引用一些官方指针(MSDN)?我也可以参考一些官方指针(MSDN)吗?使用相同的搜索引擎 – 2012-02-06 14:25:48