首先,我查看了大部分有关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调用时失败。我不知道为什么。不幸的是,我处于这样一种情况,即唯一可行的方法是太慢而不可行。有没有办法加快速度呢?
提前致谢!
答案 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会非常慢。