应该返回'false'时返回'true'的方法

时间:2013-11-12 09:21:47

标签: c# .net windows security active-directory

我正在使用Active Directory DirectoryServices.AccountManagement API,并尝试使用以下代码连接到服务器:

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, (server + ":" + port), loginUsername, loginPassword);

我要做的第一件事是检查loginUsernameloginPassword是否有效并且在Active Directory实例中具有足够的权限。为此,我打电话给以下人员:

bool x = principalContext.ValidateCredentials(null, null);

根据documentation,这会验证构造函数中指定的凭据,因为传递了null。在调试器中,抛出以下错误,表明凭据为false:

enter image description here

然而,ValidateCredentials检查的实际结果奇怪地返回true,因此代码继续执行。

如何解决这个问题?

修改

这是另一个详细说明错误的屏幕截图。如屏幕截图所示,我打电话的ValidateCredentials的方法,以及使null的值的用户名和密码,其中根据文件将尝试验证在PrincipalContext类的构造函数传递的凭证。

屏幕截图还显示了传递的用户名和密码是如何“test”的,这些都是无效的,并且在Active Directory中不存在。即使显示了许多错误,该方法也会返回true。

enter image description here

1 个答案:

答案 0 :(得分:0)

您只需要停止查找空值...

if (string.IsNullOrEmpty(password) || string.IsNullOrEmpty(username)) return false;

我进行了一些测试

    using (var pc = new PrincipalContext(ContextType.Domain, "mydomain.lan")){

    var isOk1 = pc.ValidateCredentials(null,null); //Always true
    var isOk2 = pc.ValidateCredentials("notexists","wrong"); //false
    var isOk2 = pc.ValidateCredentials("existing","correct"); //true
    }

    using (var pc = new PrincipalContext(ContextType.Domain, "mydomain.lan", "notright","wrong")){
        var isOk1 = pc.ValidateCredentials(null,null); //Always true
        var isOk2 = pc.ValidateCredentials("notexists","wrong"); //false
        var isOk2 = pc.ValidateCredentials("existing","correct"); //true
}

因此,ValidateCredentials在上下文中并不真正需要用户...如果你提供了一个假的,那么对于说,用户组的后续查找将会失败

是的,文档内容如下:

ValidateCredentials方法绑定到构造函数中指定的服务器。如果username和password参数为null,则验证构造函数中指定的凭据。如果构造函数中未指定凭证,并且username和password参数为null,则此方法将验证当前主体的默认凭据。
http://msdn.microsoft.com/en-us/library/bb154889%28v=vs.100%29.aspx

但是我无法验证构造函数中的信用是否正在发挥作用

编辑:您已经接受了,但也许您可以使用此方法解决问题?

 using (var pc = new PrincipalContext(ContextType.Domain, "domain.lan", username, password))
            {
                if (pc.ValidateCredentials(username, password))
                {
                    try
                    {
                        using (var searcher = new PrincipalSearcher(new UserPrincipal(pc)))
                        {
                            searcher.QueryFilter.SamAccountName = username;
                            Principal u = searcher.FindOne();
                        }
                    }
                    catch (Exception)
                    {
                        return "no rights to work on ad";
                    }
                }
                else
                {
                    return "user cannot login";
                }
            }