18

我有一个 MVC 应用程序需要登录并针对 Active Directory 验证用户。我正在使用该PrincipalContext.ValidateCredentials方法,但总是获得false.

连接到服务器没问题。该问题似乎发生在ValidateCredentials.

这是我的代码:

public static bool IsAuthenticated(string domain, string username, string pwd) {
    bool IsAuthenticated = false;

    try {
        PrincipalContext insPrincipalContext = 
            new PrincipalContext(ContextType.Domain, domain, "DC=c1w,DC=com");

        username = "c1w\\" + username;

        IsAuthenticated = insPrincipalContext.ValidateCredentials(username, pwd);
    }
    catch (Exception ex)
    {
        // Rethrow this exception
        ExceptionPolicy.HandleException(ex, "Exception Policy");
    }

    return IsAuthenticated;
}

任何人都知道为什么会发生这种情况?

4

3 回答 3

19

工作原理如下ValidateCredentials(string, string):首先,它尝试使用NegotiateSigningSealingcontext 选项进行身份验证。如果失败,它会使用SimpleBindand再次尝试SecureSocketLayer

问题是 NT4(又名“旧版”,又名“下级名称”)格式(DOMAIN\UserName或更准确地说,NetBiosName\SamAccountName)不适用于协商。但它确实适用于 SimpleBind。

所以调用 2 参数方法时可能发生的情况ValidateCredentials()是,它首先使用 Negotiate 失败,因为它不喜欢 NT4 格式,然后在使用简单绑定时再次失败。

在我自己的测试中,我发现即使在回退到使用简单绑定后它仍然失败的原因是它不仅使用了 SimpleBind。它正在使用SimpleBindplus SecureSocketLayer。这意味着如果 Active Directory 服务器没有正确设置为使用 SSL(测试环境的常见场景),它仍然会失败。

正如其中一条评论中提到的,您永远,永远不想单独使用SimpleBind(没有SecureSocketLayer),否则您的密码将以纯文本形式通过网络发送。

在野外,我已经看到一些 Active Directory 系统根本不允许使用简单绑定,因此您必须使其与 Negotiate 一起使用。

我找到了两种方法来处理这个问题:

1) 如果一切都发生在同一个域上,您应该能够ValidateCredentials只使用用户名(SAM 帐户名)进行调用,而忽略“DOMAIN\”部分。然后,它会在第一次使用 Negotiate 时正常工作。

2)如果域部分很重要,因为可能涉及多个域(即Domain1\UserA并且Domain2\UserA是不同的人),那么它会变得更复杂一些。在这种情况下,我最终将 NT4 名称 (DOMAIN\User) 转换为“用户主体名称”格式(例如LogonName@domain.com)。有几种不同的方法可以做到这一点。最简单的可能是使用 3 参数重载UserPrincipal.FindByIdentity(),然后在结果上获取UserPrincipalName属性的值。另一种方法是使用 aDirectorySearcher并查询具有匹配值的用户LDAP://domain的属性。注意:此解决方案仅在涉及的所有域都在同一个林中时才有效。userPrincipalNamesAMAccountName

于 2015-07-17T14:18:22.117 回答
9

我看不到您在哪里初始化“pwd”变量也许您应该在此方法中使用ContextOption来准确指定所需的行为。抱歉回答太笼统,但您的问题没有太多细节

于 2010-03-02T14:16:15.857 回答
1

您似乎正在使用 domain\userName 格式验证用户。您可能希望从 userName 解析域名并使用 ValidateCredential。

于 2012-02-22T17:01:28.237 回答