Active Directory PrincipalContext.ValidateCredentials域消除歧义

本文关键字:歧义 ValidateCredentials Directory PrincipalContext Active | 更新日期: 2023-09-27 18:26:08

我正在处理两个域,其中一个是受信任的域。一个域上可能有一个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);
        }
    }

Active Directory PrincipalContext.ValidateCredentials域消除歧义

ValidateCredentialsuserPrincipalName协同工作,您可以尝试构建第一个参数(用户名),将登录名和域结合起来,以创建用户名JohnSmith@dom1.comJohnSmith@dom2.com

您总是可以检索使用登录的用户的完整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

使用向上。SamAccountName对包括域名在内的ValidateCredentials的后续调用-毕竟不能有两个用户使用相同的SamAccountName登录!

DistinguishedName肯定会显示JohnSmith登录了哪个。

基于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;
        }
    }

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

Domain = Company
User1 = employee@department1.com (under company Domain)
User2 = employee2@Department2.com (under company Domain)

提供的答案将使用返回错误

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

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

string userPrincipalName = userName + "@" + domain;

在没有.com部分的情况下,它在该域中搜索用户AT,而不是在全局域中搜索电子邮件。