Как правильно аутентифицировать пользователя по Active Directory? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь аутентифицировать пользователей по Active Directory и использую приведенный ниже код для проверки их учетных данных.

bool isValid = principalContext.ValidateCredentials(username, password, ContextOptions.Negotiate);

if (isValid)
{
    userPrincipal = UserPrincipal.FindByIdentity(principalContext, username);
}

Моя проблема заключается в том, что метод ValidateCredentials не проверяет пароль пользователя, когдаusername = "domain\username" и всегда возвращает true, но когда username = "username" или username@domain.com, он работает и возвращает false, когда пароль недействителен.

Сценарий 1:

username = "CorrectUserName" и пароль = "IncorrectPassword" => isValid = false.

username = "CorrectUserName" и пароль = "CorrectPassword" => isValid = true.

Сценарий 2:

username = "CorrectUserName@Domain.com" и пароль = "IncorrectPassword" => isValid = false.

username = "CorrectUserName@Domain.com" и пароль= "CorrectPassword" => isValid = true.

Сценарий 3 (это моя проблема):

username = "Domain \ CorrectUserName" и пароль = "IncorrectPassword"=> isValid = true.

username = "Domain \ CorrectUserName" и password = "CorrectPassword" => isValid = true.

Мой код выглядит так учебник с небольшими изменениями.

Я не знаюне знаю, что я здесь делаю не так.

1 Ответ

0 голосов
/ 26 сентября 2018

ValidateCredentials принимает имя пользователя без информации о домене.Домен должен быть определен при создании PrincipalContext:

if (!username.Contains("@") && !username.Contains(@"\"))
{
    // EXCEPTION
}

var domain = username.Contains("@") ? username.Split("@")[1].Split(".")[0] : username.Split(@"\")[0];
var principalContext = new PrincipalContext(ContextType.Domain, domain);

var user = username.Contains("@") ? username.Split("@")[0] : username.Split(@"\")[1];
var isValid = principalContext.ValidateCredentials(user, cleartextpw);

PrincipalContext

ValidateCredentials

...