2

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

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

我想做的第一件事是检查loginUsernameandloginPassword是否有效并且在 Active Directory 实例中具有足够的权限。为此,我调用以下命令:

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

根据文档,这将验证构造函数中指定的凭据,因为null已传递。在调试器中,抛出以下错误,表明凭据为假:

在此处输入图像描述

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

如何解决?

编辑:

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

屏幕截图还显示了通过的用户名和密码如何都是“测试”,它们是无效的并且不存在于 Active Directory 中。该方法返回 true,即使显示了许多错误。

在此处输入图像描述

4

1 回答 1

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 方法绑定到构造函数中指定的服务器。如果用户名和密码参数为空,则验证构造函数中指定的凭据。如果构造函数中没有指定凭据,并且用户名和密码参数为空,则此方法验证当前主体的默认凭据。
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";
                }
            }
于 2013-11-12T10:58:06.813 回答