PrincipalContext.ValidateCredentials非常慢

时间:2012-06-06 19:09:10

标签: .net directoryservices

首先,我查看了大部分有关SO的问题,但似乎没有一个问题完全相同。 Here是一个类似的问题,但并不完全相同。在我的情况下,我正在创建一个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调用时失败。我不知道为什么。不幸的是,我处于这样一种情况,即唯一可行的方法是太慢而不可行。有没有办法加快速度呢?

提前致谢!

2 个答案:

答案 0 :(得分:12)

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

用户名不应包含域名。对于域我的测试只使用短名称“DOMAIN”,而不是DN或甚至完全合格(您的milage可能会有所不同)。

添加对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")) { }

答案 1 :(得分:0)

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

例如,来自"域名:abc" => "域名:abc.com"

我的代码:

ngOnInit() {
    this.CartdataService.get_Product_Path('').subscribe(response =>
    { 
        console.log(response);
        this.images = response.json(); 
    });
  }

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

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