我正在尝试根据Active Directory对用户进行身份验证,并且正在使用下面的代码来验证其凭据。
bool isValid = principalContext.ValidateCredentials(username, password, ContextOptions.Negotiate);
if (isValid)
{
userPrincipal = UserPrincipal.FindByIdentity(principalContext, username);
}
我的问题是,在username = "domain\username"
时ValidateCredentials方法不验证用户密码,并且始终返回true,但是在username = "username"
或username@domain.com
时,该方法有效并且当密码无效。
场景1:
username =“ CorrectUserName”和密码=“ IncorrectPassword” => isValid = false。
username =“ CorrectUserName”和密码=“ CorrectPassword” => isValid = true。
方案2:
用户名=“ CorrectUserName@Domain.com”,密码=“ IncorrectPassword” => isValid = false。
用户名=“ CorrectUserName@Domain.com”,密码=“ CorrectPassword” => isValid = true。
方案3(这是我的问题):
用户名=“ Domain \ CorrectUserName”,密码=“ IncorrectPassword” => isValid = true。
用户名=“ Domain \ CorrectUserName”,密码=“ CorrectPassword” => isValid = true。
我的代码看起来像tutorial,但有少量更改。
我不知道我在做什么错。
答案 0 :(得分:2)
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