我尝试使用以下代码对Active Directory(AD DS)的登录凭据进行身份验证:
using (var context = new PrincipalContext(ContextType.Domain, ipAddress))
{
Console.WriteLine("Connected to {0}:", context.ConnectedServer);
context.ValidateCredentials(username, password);
}
其中ipAddress是主域控制器的地址。但是,这在尝试阅读context.ConnectedServer
时会出现以下错误:
System.DirectoryServices.DirectoryServicesCOMException(0x8007052E): 用户名或密码不正确。
除了这个问题,我还有以下限制:
生产环境可能在域上,也可能不在域中。
客户端不想输入任何特权凭据来查询目录。
由于这第二个约束,我试图执行一个SimpleBind,但没有太多运气:
using (var context = new PrincipalContext(ContextType.Domain,
ipAddress,
null,
ContextOptions.SimpleBind,
usernameToValidate,
password))
基于这些限制,我如何针对Active Directory进行身份验证?
答案 0 :(得分:1)
我可以使用以下代码进行身份验证:
using (var context = new PrincipalContext(ContextType.Domain, ipAddress))
{
// NOTE! Username must be of the format domain\username
return context.ValidateCredentials("domain\someuser", password, ContextOptions.SimpleBind);
}
关键部分是在用户名前加上短域名。一旦我这样做,并在调用ValidateCredentials
而不是在上下文构造函数中指定了SimpleBind,它运行正常。