对于未知用户,ValidateCredentials返回true?

时间:2011-09-07 15:09:05

标签: c# .net-4.0 active-directory

我在这里看到一些使用PrincipalContext.ValidateCredentials的奇怪行为。设置是父/子设置中的两个Active Directory域(因此我们有主域company.com和子域development.company.com)。

当我针对主域验证凭据时,ValidateCredentials的行为与预期一致,对于良好的用户/传递对返回true,对于其他任何对返回false。

但是,如果我在子域中验证用户,ValidateCredentials对于良好的用户名/密码和无效用户都返回true。如果我向有效用户提供密码无效,则会正确返回false。

现在我正在通过首先执行UserPrincipal.FindByIdentity()来解决它,如果用户存在,则调用ValidateCredentials - 但我想了解发生了什么。

我看过的另一个解决方法是将用户名作为domain\username传递给ValidateCredentials

  

在此函数的每个版本中,userName字符串可以位于其中一个中   各种不同的格式。有关可接受的完整列表   格式类型,请参阅ADS_NAME_TYPE_ENUM文档。

...列出了这种形式的用户名。但是这会导致bool authenticated = false; // Various options tried for ContextOptions, [etc] inc. explicit username/password to bind to AD with -- no luck. using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain, null, ContextOptions.Negotiate, null, null)) { log(pc.ConnectedServer + " => " + pc.UserName + " => " + pc.Name + " => " + pc.Container); using (var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, username)) { if (user != null) { log(user.DistinguishedName + "; " + user.DisplayName); authenticated = pc.ValidateCredentials(username, password); } else { log("User not found"); // Debug only -- is FindByIdentity() needed. This should always return // false, but doesn't. authenticated = pc.ValidateCredentials(username, password); } } } return authenticated; 始终返回true,无论我传入的用户名和密码是什么组合。

相关代码是:

runas /user:subdomain\user cmd

任何和所有(明智的)建议都欢迎 - 我对此感到不满,因为它违背了所有期望。

我应该补充一下:这是我自己在我的机器上运行的,两者都是主域的成员。但是我也尝试在我的机器上以命令提示符的形式运行它,作为子域({{1}})的用户,结果完全相同。

3 个答案:

答案 0 :(得分:17)

之后进行了一些谷歌搜索(不是说我整天都在试图找到这个谷歌),我found the answer

简单地说,如果在域中启用了Guest帐户,则ValidateCredentials将为未知用户返回TRUE。我刚刚在development.company.com上检查了来宾用户的状态,确定该帐户已启用。如果我禁用了来宾帐户,则ValidateCredentials会正确返回false。

这是一个相当基本的问题,不确定我是否热衷于这种行为......可惜它在MSDN上没有明确提及。

答案 1 :(得分:0)

是否与this

有关
  

ValidateCredentials方法绑定到中指定的服务器   构造函数。如果用户名和密码参数为null,则为   验证构造函数中指定的凭据。 如果没有   凭证在构造函数中指定,用户名和   password参数为null,此方法验证默认值   当前校长的凭证

答案 2 :(得分:0)

我在ContextOptions.SimpleBind中使用了ValidateCredentials标志,它解决了我的问题。

示例代码:

    using (var context = new PrincipalContext(ContextType.Domain, "DOMAIN", null))
    {
        bool loginResult = context.ValidateCredentials(username, password, ContextOptions.SimpleBind); // returns false for unknown user
    }