c# - 如何根据 Active Directory 正确验证用户身份?

标签 c# asp.net-mvc active-directory owin

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

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

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

我的问题是 ValidateCredentials 方法在 username = "domain\username" 时不验证用户的密码并且始终返回 true,但是当 username = "username"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e3969086918d828e86a3878c8e828a8dcd808c8e" rel="noreferrer noopener nofollow">[email protected]</a> ,当密码无效时,它会起作用并返回 false。

场景 1:

用户名 = "CorrectUserName"和密码 = "In CorrectPassword"=> isValid = false。

用户名 = "CorrectUserName"和密码 = "CorrectPassword"=> isValid = true。

场景 2:

用户名 = "[email protected] "和密码 = "In CorrectPassword"=> isValid = false。

用户名 = "[email protected] "和密码 = "CorrectPassword"=> isValid = true。

场景 3(这是我的问题):

用户名 = "Domain\CorrectUserName"和密码 = "In CorrectPassword"=> 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

关于c# - 如何根据 Active Directory 正确验证用户身份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52525039/

相关文章:

c# - XSD 的属性以防止 XSD.exe FieldSpecified 标志

javascript - 通过jquery清除浏览器保存的密码

asp.net-mvc - MVC 3 GlobalFilters排除

angularjs - 从 WAAD 获取用户组的最简单方法是什么?

c# - WebClient UseDefaultCredentials 不适用于 ldap 身份验证

c# - 泛型方法 - 类型不能用作类型参数

c# - 如何使用 gstreamer-sharp 捕获视频帧

c# - ElasticSearch C# 客户端 (NEST) : access nested aggregation results

asp.net-mvc - 带有Windows身份验证的ASP.NET MVC Intranet应用程序,如何自动获取当前域用户?

c# - 从 Active Directory 检索用户名