针对Active Directory的SimpleBind身份验证

时间:2014-03-17 15:51:50

标签: c# asp.net authentication active-directory ldap

我尝试使用以下代码对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进行身份验证?

1 个答案:

答案 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,它运行正常。