2010-10-14 75 views
0

我需要验证密码对用户是否正确。验证密码是否正确

我有这样的代码:

private bool checkOldPasswordValid(string password, string username) 
    { 
     using (DirectoryEntry entry = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer")) 
     { 
      entry.Username = username; 
      entry.Password = password; 

      DirectorySearcher searcher = new DirectorySearcher(entry); 

      searcher.Filter = "(objectclass=user)"; 
      try 
      { 
       searcher.FindOne(); 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
      return true; 
     } 
    } 

但随后的目录搜索不与WINNT支持,让我经历了所有的记录中发现另一种方式来循环。

foreach (DirectoryEntry dc in entry.Children) 
      { 
       // prints the name 
       System.Diagnostics.Debug.WriteLine(dc.Name); 
      } 

但这只是得到的名称,并没有验证密码。

请大家帮忙。谢谢

回答

3

要验证LDAP或WinNT,您不需要DirectorySearcher。您只需从DirectoryEntry实例中获取NativeObject即可。这里有一个代码示例,可能会指导您完成。

public bool Authenticate(string username, string password, string domain) { 
    bool authenticated = false; 

    using (DirectoryEntry entry = new DirectoryEntry(@"WinNT://" + domain, username, password) { 
     try { 
      object nativeObject = entry.NativeObject; 
      authenticated = true; 
     } catch (DirectoryServicesCOMException ex) { 
     } 
    } 

    return authenticated; 
} 

此代码将返回一个用户是否真实。一旦你可以使用这个DirectoryEntry类实例获取NativeObject属性,这意味着AD(或本地计算机)使用模拟来获取此对象。如果您在没有抛出异常的情况下获取对象,这意味着AD(或本地计算机)能够对模拟用户进行身份验证。

尽管您可以通过指定没有用户名和密码,但仅指定域(或本地计算机),通过指定用户名和密码来使用当前已通过身份验证的用户,但是您要求使用身份验证,因此安全基础结构将使用尝试从此DirectoryEntry类实例中检索NativeObject属性的给定用户名和密码。

要对AD进行身份验证,请将"WinNT://"替换为"LDAP://"

+0

如果域名有时是空白的话会怎么样?会是一个问题吗? – user175084 2010-10-14 15:52:02

+1

域可以是本地计算机名称,也可以是使用AD的域控制器中的域。通常情况下,域不应该是空白的。我从来没有测试过一个空白域,但我想这会导致'try ... catch'扔。也许最好是单元测试,然后尝试每个参数的每个可能的值。 – 2010-10-14 15:55:52

+0

DirectoryEntry entry = new DirectoryEntry(“WinNT://”+ Environment.MachineName,Session [“userName”]。ToString(),password); – user175084 2010-10-14 16:18:33

2

您可以使用DirectoryEntry本身。

在这里看到的例子:你为什么要使用WINNT http://support.microsoft.com/kb/316748

://反正?

+0

假设本地帐户不是活动目录的一部分,..那就是为什么。 。但我不知道..请让我知道,如果你有更多的信息在此..谢谢 – user175084 2010-10-14 15:43:23

+0

他使用WinNT://对计算机本身进行身份验证,而不是AD。 – 2010-10-14 15:43:55

+1

@ user175084:使用AD时,您不应管理本地帐户。让我解释。假设用户在本地计算机上认证自己,然后希望访问网络资源。即使您通过本地计算机对该用户进行了身份验证,但如果用户不知道AD,AD也不会让该用户获得他所需的任何资源。如果您希望管理本地计算机用户帐户,则情况会有所不同。 – 2010-10-14 15:47:03