Active Directory PrincipalContext.ValidateCredentials устранение неоднозначности домена - PullRequest
4 голосов
/ 28 февраля 2012

Я имею дело с двумя доменами - один является доверенным доменом.В одном домене может быть 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 ]

5 голосов
/ 28 февраля 2012

ValidateCredentials работает с userPrincipalName. Возможно, вы можете попытаться создать первый параметр (имя пользователя), объединяющий логин и домен, для создания имени пользователя JohnSmith@dom1.com против JohnSmith@dom2.com.

4 голосов
/ 04 июля 2014

Вы всегда можете получить полный 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 вошел в систему.

2 голосов
/ 28 февраля 2012

Основываясь на ответе 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;
        }
    }
0 голосов
/ 05 декабря 2013

Принятый ответ потерпит неудачу с доменами, содержащими разные адреса электронной почты. Пример:

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 выполняет поиск пользователя в этом домене вместо поиска электронной почты в глобальном домене.

...