我正在为离线应用程序实施AD身份验证。
我的原始代码执行了以下操作:
var validAuth = false;
using (var context = new System.DirectoryServices.AccountManagement.PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain))
{
validAuth = context.ValidateCredentials(_viewModel.Username, txtPassword.Password);
}
但是,在测试期间,我们注意到这导致帐户锁定占AD组策略尝试次数的一半 - 所以说在锁定之前策略被设置为4次尝试,用户将被锁定在2中。
我用Google搜索并发现了这篇文章on MSDN和TL; DR就是这样:
如果您使用UPN格式(Domain @ sAMAccountName),听起来密码计数错误增加2,但是,如果您使用sAMAccountName格式(Domain \ sAMAccountName),则每次计数增加1。
鉴于此,我将我的代码更改为:
var validAuth = false;
using (var context = new System.DirectoryServices.AccountManagement.PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain))
{
var usernameToAuth = string.Format("{0}\\{1}", Environment.UserDomainName, _viewModel.Username);
validAuth = context.ValidateCredentials(usernameToAuth, txtPassword.Password);
}
但无论输入如何,现在都无法进行身份验证。如果我将其更改为使用用户@域的旧式UPN格式,则它可以正常验证 - 但显然这会占用两个身份验证请求。
MSDN帖子说使用sAMAccountName格式作为解决方法,但我正在努力弄清楚如何做到这一点。我的原始代码也没有明确使用旧的UPN格式 - 我只是将用户名直接传递给ValidateCredentials
方法(任何地方都没有@符号可见)所以这个方法首先使用旧的UPN方法?
请提出任何建议 - 我并不特别希望我们的用户可以尝试一半的错误登录。
答案 0 :(得分:0)
我在PrincipalContext
构造函数中使用了域规范,在此post中指定,如下所示:
public static bool IsAuthenticated(string username_, string password_)
{
using (var pc = new PrincipalContext(ContextType.Domain, DomainManager.DomainName))
return pc.ValidateCredentials(username_, password_);
}
就我而言,我使用System.DirectoryServices.ActiveDirectory.Domain
和System.DirectoryServices.ActiveDirectory.DomainController
来获取此DomainManager.DomainName
值。