PrincipalContext.ValidateCredentials
을 사용하여 이상한 행동을 보았습니다. 이 설정은 상위/하위 설정의 두 Active Directory 도메인입니다 (주 도메인이 company.com
이고 하위 도메인이 development.company.com
).ValidateCredentials는 알 수없는 사용자에게 true를 반환합니까?
기본 도메인에 대한 자격 증명의 유효성을 검사 할 때 ValidateCredentials
은 예상대로 작동하고 올바른 사용자/전달 쌍에 대해 true를 반환하고 다른 것에 대해서는 false를 반환합니다.
그러나 하위 도메인에서 사용자의 유효성을 검사하면 좋은 사용자 이름/비밀번호와 유효하지 않은 사용자 모두에 대해 ValidateCredentials
이 true를 반환합니다. 유효한 사용자에게 잘못된 암호를 제공하면 올바르게 false가 반환됩니다.
이제는 UserPrincipal.FindByIdentity()
을 먼저 수행하고 사용자가있는 경우 ValidateCredentials
을 호출합니다. 그러나 나는 무슨 일이 일어나는지 알고 싶습니다.
나는 MSDN entry for ValidateCredentials
states로 domain\username
로 이름을 통과하는 것입니다 검토 한 다른 해결 방법 :이 기능의 각 버전에서
, 사용자 이름 문자열은 중 하나에 서로 다른 다양한 형식이 될 수 있습니다 . 허용되는 형식 유형의 전체 목록을 보려면 ADS_NAME_TYPE_ENUM 설명서를 참조하십시오.
...이 형식의 사용자 이름이 나열됩니다. 그러나 이것은 ValidateCredentials
는 관계없이 항상 내가 전달 사용자 이름과 암호의 어떤 조합, true를 반환하지됩니다
관련 코드는 다음과 같습니다
bool authenticated = false;
// Various options tried for ContextOptions, [etc] inc. explicit username/password to bind to AD with -- no luck.
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain, null, ContextOptions.Negotiate, null, null))
{
log(pc.ConnectedServer + " => " + pc.UserName + " => " + pc.Name + " => " + pc.Container);
using (var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, username))
{
if (user != null)
{
log(user.DistinguishedName + "; " + user.DisplayName);
authenticated = pc.ValidateCredentials(username, password);
} else {
log("User not found");
// Debug only -- is FindByIdentity() needed. This should always return
// false, but doesn't.
authenticated = pc.ValidateCredentials(username, password);
}
}
}
return authenticated;
모든 모든 (분별) 제안 환영 - 난. 그냥 내 모든 기대에 어긋나게 내 머리를 긁적.
내가 추가해야 할 사항 : 이것은 내 컴퓨터에서 실행되고 있으며 둘 다 기본 도메인의 구성원입니다. 그러나 나는 또한 정확히 동일한 결과를 가진 하위 도메인 (runas /user:subdomain\user cmd
)의 사용자로 내 컴퓨터의 명령 프롬프트에서 실행 해 보았습니다.
두 도메인이 있습니다. 내 도메인의 IP 주소를 사용하여 유효성 검사 자격 증명을 호출 할 수 있으며 두 도메인의 사용자 이름 또는 비밀번호를 전달하면 성공합니다. 나는이 여분의 정보를 제공 할 필요가 없다는 것에 놀라움을 금치 못합니다. 그리고 나서 올바른 도메인에서 올바른 사용자의 유효성을 확인하는 방법을 조금 혼란스럽게 생각합니다. (각각이 jsmith를 말할 수는 없습니까?) – Greg