9

首先,我查看了关于 SO 的大多数问题,但似乎都不是完全相同的问题。是一个类似的问题,但并不完全相同。在我的情况下,我正在创建一个 PrincipalContext :

Dim pctx As PrincipalContext = New PrincipalContext(ContextType.Domain, fullyqualifieddomain, container, ADUserID, ADPassword)


   If pctx.ValidateCredentials(userName, password) Then

ADUserID 是一个服务帐户。

此方法有效,但需要 6-10 秒以上。

我也尝试过直接检索底层目录条目和绑定。这要快得多,并且可以在我的机器(域外)上工作,但不能在 Web 服务器(域内)上工作。它在 DirectoryEntry.NativeObject 调用时失败。我不知道为什么。不幸的是,我处于这样一种情况,即唯一可行的方法太慢而无法实现。有没有办法加快这个速度?

提前致谢!

4

2 回答 2

15

试试下面的代码。它可能不会更快,但很高兴看看它是否有效。

用户名应该不包括域。对于域,我的测试只使用了短名称“DOMAIN”,而不是 DN 甚至完全限定(您的里程可能会有所不同)。

添加对 System.DirectoryServices.Protocols 的引用。

using System.DirectoryServices.Protocols;

public static bool Authenticate(string username, string password, string domain)
{
    try
    {
        //string userdn;
        using (LdapConnection lconn = new LdapConnection(new LdapDirectoryIdentifier(domain)))
        {
            lconn.Bind(new System.Net.NetworkCredential(username, password, domain));
            return true;
        }
    }
    catch (LdapException e)
    {
        return false;  
    }
}  

if (Authenticate("username", "password", "domain")) { }
于 2012-06-07T19:27:23.353 回答
2

如果您的域使用 NetBIOS 名称,请尝试将其更改为 DNS 名称(如果有)。

例如,从“域:abc”=>“域:abc.com”

我的代码:

PrincipalContext dc = new PrincipalContext(ContextType.Domain, domain, dn, user, password);
bool authenticated = dc.ValidateCredentials(user, password);
if (authenticated) var info = UserPrincipal.FindByIdentity(dc, IdentityType.SamAccountName, $"{domain}\\{user}");

2018/04/03 14:54:32[Info]PrincipalContext time:00:00:04.7638888
2018/04/03 14:54:41[Info]authenticated time:00:00:09.1260688
2018/04/03 14:54:46[Info]info time:00:00:04.7254238

2018/04/03 15:16:30[Info]PrincipalContext time:00:00:00.1557923
2018/04/03 15:16:30[Info]authenticated time:00:00:00.0373904
2018/04/03 15:16:30[Info]info time:00:00:00.0915680

从 NetBIOS 名称获取 IP 需要花费大量时间,这就是为什么如果使用 NetBIOS 名称作为域,PrincipalContext 会很慢。

于 2018-04-03T07:29:47.957 回答