LDAP绑定.NET DirectoryEntry始终成功

时间:2012-10-11 17:33:14

标签: .net ldap

我正在使用用户的电子邮件地址作为密钥在基于表单的C#登录方案中查找任意Windows帐户。找到用户工作正常,我得到了我的派生UserPrincipalEx罚款。

但是,当我尝试使用Bind验证登录时,它总是成功:

// we can't use ValidateCredentials because it's too broken - multiple attempts each time,
// can't always negotiate properly, etc.
//if (!_principalContext.ValidateCredentials(userPrincipal.UserPrincipalName, password)) {
//    return LoginValidationResults.ValidationFailed;
//}
try {
    using (var directoryEntry = new DirectoryEntry("LDAP://" + _domain + "/" + _principalContext.Container,
        userPrincipal.UserPrincipalName, password, AuthenticationTypes.FastBind)) {
        var forceBind = directoryEntry.NativeObject;
        Log.DebugFormat("Validation successful ({0}).", forceBind);
        return LoginValidationResults.Valid;
    }                    
}
catch (COMException ex) {
    if (ex.ErrorCode != -2147023570) {
        Log.DebugFormat("Validation exception: {0}", ex.ToString());
        throw;
    }
    Log.Debug("Validation failed.");
    return LoginValidationResults.ValidationFailed;
}

在某些情况下 - 我无法弄清楚它们到底是什么 - 无论我提供什么密码,帐户都会成功绑定。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

因此,我使用一些数据包捕获查看了这一点,并发现所有后续绑定都使用空白用户名。

果然,有问题的用户有一个空白(实际上是null - 未设置)UPN。这应该永远不会发生在我们的场景中,但确实如此因为它是一个破碎的用户案例,我只是检测到并抛出异常。