Asp.net中的Active Directory性能问题

时间:2015-03-23 05:26:42

标签: c# asp.net angularjs performance active-directory

我使用的是活动目录登录

我遇到了一些性能问题

这是我的代码

 public bool IsAuthenticated(String domain, String username, String pwd)
        {

            String domainAndUsername = domain + @"\" + username;
            DirectoryEntry entry = new DirectoryEntry("LDAP://" + _path, domainAndUsername, pwd);

            try
            {   //Bind to the native AdsObject to force authentication.         
                Object obj = entry.NativeObject;

                DirectorySearcher search = new DirectorySearcher(entry);

                search.Filter = "(SAMAccountName=" + username + ")";
                search.PropertiesToLoad.Add("cn");
                SearchResult result = search.FindOne();

                if (null == result)
                {
                    return false;
                }

                //Update the new path to the user in the directory.
                _path = result.Path;
                _filterAttribute = (String)result.Properties["cn"][0];
            }
            catch (Exception ex)
            {
                throw new Exception("Error authenticating user. " + ex.Message);
            }

            return true;
        }

当我输入正确的用户名和密码时,它的工作正常且快速。 但是当我输入错误的用户名和密码时,它的加载速度非常慢。


这两行编码

Object obj = entry.NativeObject;
 DirectorySearcher search = new DirectorySearcher(entry);

在登录输入错误时需要很长时间才能返回结果。


所以我的问题是

  • 为什么那些线路需要很长时间才能加载,每当我输入错误的登录信息?
  • 为什么这些线路需要快速加载,每当我输入正确的logindetails?

一个人已经在SO中提出了这个问题

Is using DirectoryServices.NativeObject slow/bad?

但没有人回答这个问题。请告诉我解决方案:)

1 个答案:

答案 0 :(得分:0)

这需要很长时间,因为它必须检查每个对象以与输入进行比较,因为它从未找到正确的对象。

但是,这是对活动目录中的用户进行身份验证的一种不必要的复杂方法。

这更容易:

    public bool ValidateCredentials(string domain, string username, string password)
    {
        using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domain))
        {
            return context.ValidateCredentials(username, password);
        }
    }

然后更新值。