我正在使用Active Directory DirectoryServices.AccountManagement
API,并尝试使用以下代码连接到服务器:
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, (server + ":" + port), loginUsername, loginPassword);
我要做的第一件事是检查loginUsername
和loginPassword
是否有效并且在Active Directory实例中具有足够的权限。为此,我打电话给以下人员:
bool x = principalContext.ValidateCredentials(null, null);
根据documentation,这会验证构造函数中指定的凭据,因为传递了null
。在调试器中,抛出以下错误,表明凭据为false:
然而,ValidateCredentials检查的实际结果奇怪地返回true
,因此代码继续执行。
如何解决这个问题?
修改
这是另一个详细说明错误的屏幕截图。如屏幕截图所示,我打电话的ValidateCredentials
的方法,以及使null
的值的用户名和密码,其中根据文件将尝试验证在PrincipalContext类的构造函数传递的凭证。
屏幕截图还显示了传递的用户名和密码是如何“test”的,这些都是无效的,并且在Active Directory中不存在。即使显示了许多错误,该方法也会返回true。
答案 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";
}
}