如何根据 Active Directory 正确验证用户身份?
How to properly authenticate user against Active Directory?
我正在尝试根据 Active Directory 对用户进行身份验证,并且我正在使用下面的代码来验证他们的凭据。
bool isValid = principalContext.ValidateCredentials(username, password, ContextOptions.Negotiate);
if (isValid)
{
userPrincipal = UserPrincipal.FindByIdentity(principalContext, username);
}
我的问题是 ValidateCredentials 方法在 username = "domain\username"
时不验证用户的密码,并且始终 return 为真,但在 username = "username"
或 username@domain.com
时,它有效,当密码无效时 return false。
场景一:
用户名 = "CorrectUserName" 和密码 = "IncorrectPassword" => isValid = false.
用户名 = "CorrectUserName" 和密码 = "CorrectPassword" => isValid = true.
场景二:
用户名 = "CorrectUserName@Domain.com" 和密码 = "IncorrectPassword" => isValid = false.
用户名 = "CorrectUserName@Domain.com" 和密码 = "CorrectPassword" => isValid = true.
场景3(这是我的问题):
用户名 = "Domain\CorrectUserName" 和密码 = "IncorrectPassword" => isValid = true.
用户名 = "Domain\CorrectUserName" 和密码 = "CorrectPassword" => isValid = true.
我的代码看起来像这样 tutorial,稍作改动。
我不知道我做错了什么。
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
我正在尝试根据 Active Directory 对用户进行身份验证,并且我正在使用下面的代码来验证他们的凭据。
bool isValid = principalContext.ValidateCredentials(username, password, ContextOptions.Negotiate);
if (isValid)
{
userPrincipal = UserPrincipal.FindByIdentity(principalContext, username);
}
我的问题是 ValidateCredentials 方法在 username = "domain\username"
时不验证用户的密码,并且始终 return 为真,但在 username = "username"
或 username@domain.com
时,它有效,当密码无效时 return false。
场景一:
用户名 = "CorrectUserName" 和密码 = "IncorrectPassword" => isValid = false.
用户名 = "CorrectUserName" 和密码 = "CorrectPassword" => isValid = true.
场景二:
用户名 = "CorrectUserName@Domain.com" 和密码 = "IncorrectPassword" => isValid = false.
用户名 = "CorrectUserName@Domain.com" 和密码 = "CorrectPassword" => isValid = true.
场景3(这是我的问题):
用户名 = "Domain\CorrectUserName" 和密码 = "IncorrectPassword" => isValid = true.
用户名 = "Domain\CorrectUserName" 和密码 = "CorrectPassword" => isValid = true.
我的代码看起来像这样 tutorial,稍作改动。
我不知道我做错了什么。
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);