5

我正在处理两个域 - 一个是受信任的域。一个域上可能有一个 JohnSmith,另一个域上可能有另一个 JohnSmith。这两个人都需要登录我的应用程序。

我的问题:我传入的域无关紧要 - 此代码返回 true!我如何知道哪个 JohnSmith 正在登录?

    static public bool CheckCredentials(
        string userName, string password, string domain)
    {
        using (var context = new PrincipalContext(ContextType.Domain, domain))
        {
            return context.ValidateCredentials(userName, password);
        }
    }
4

4 回答 4

7

与您ValidateCredentials一起工作userPrincipalName也许可以尝试构建第一个参数(用户名)结合登录名和域来创建用户名JohnSmith@dom1.comJohnSmith@dom2.com.

于 2012-02-28T05:09:58.577 回答
4

您始终可以检索已使用登录的用户的完整 DN

UserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, userName);
up.UserPrincipalName // shows user@domain.com
up.DistinguishedName // shows CN=Surname,OU=group,DC=domain,DC=com
up.SamAccountName    // shows login name

将 up.SamAccountName 用于对 ValidateCredentials 的后续调用,包括域名 - 毕竟您不能有 2 个用户使用相同的 sAMAccountName 登录!

DistinguishedName 肯定会告诉您是哪个 JohnSmith 登录的。

于 2014-07-04T14:59:46.190 回答
3

根据 JPBlanc 的回答,我重写了我的代码。我还添加了一个 try/catch,以防传入虚假域。

    static public bool CheckCredentials(
        string userName, string password, string domain)
    {
        string userPrincipalName = userName + "@" + domain + ".com";

        try
        {
            using (var context = new PrincipalContext(ContextType.Domain, domain))
            {
                return context.ValidateCredentials(userPrincipalName, password);
            }
        }
        catch // a bogus domain causes an LDAP error
        {
            return false;
        }
    }
于 2012-02-28T19:18:16.323 回答
0

对于包含不同电子邮件地址的域,接受的答案将失败。例子:

Domain = Company

User1 = employee@department1.com (under company Domain)

User2 = employee2@Department2.com (under company Domain)

提供的答案将使用以下方法返回 false:

userName = "employee";
domain = "company";
string userPrincipalName = userName + "@" + domain + ".com";

跨域包含用户的正确方法是:

string userPrincipalName = userName + "@" + domain;

如果没有 .com 部分,它会在该域中搜索用户,而不是在全局域中搜索电子邮件。

于 2013-12-05T16:24:12.333 回答