c# - 如何针对 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。
我的代码看起来像本教程,只是做了一些小改动。
我不知道我在这里做错了什么。
解决方案
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
推荐阅读
- html - 下拉菜单元素的高度增加
- azure-devops - Kibana Dashboard 版本控制?
- microsoft-graph-api - Microsoft Graph API 返回已删除的对象
- flutter - 为什么我需要 Flutter 中的 InheritedWidget
- pandas - 名称特定的变异性计算 Pandas
- python - 在 Google Cloud 上使用 celery Worker 部署 Flask 应用
- javascript - if else 语句初学者修复
- javascript - 如何在javascript中连接一个句子的所有单词
- xmonad - XMonad:使用多个屏幕时如何在 xmobar 上显示当前可见的工作区?
- fortran - 多个同时重叠的 IBcast