首页 > 解决方案 > 如何针对 Active Directory 正确验证用户身份?

问题描述

我正在尝试针对 Active Directory 对用户进行身份验证,并且我正在使用下面的代码来验证他们的凭据。

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

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

我的问题是 ValidateCredentials 方法在并且始终返回 true 时不验证用户的密码username = "domain\username",但是当username = "username"or时username@domain.com,它起作用并在密码无效时返回 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。

我的代码看起来像本教程,只是做了一些小改动。

我不知道我在这里做错了什么。

标签: c#asp.net-mvcactive-directoryowin

解决方案


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


推荐阅读