繁体   English   中英

如何根据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);
}

我的问题是,当username = "domain\\username"时,ValidateCredentials方法不验证用户的密码,并且始终返回true,但是当username = "username"username@domain.com ,该方法有效并且当密码时返回false是无效的。

方案1:

用户名=“ CorrectUserName”和密码=“ IncorrectPassword” => isValid = false。

用户名=“ 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。

我的代码看起来像本教程 ,但做了一些小的更改。

我不知道我在做什么错。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM