使用PrincipalContext使用sAMAccountName格式对AD进行身份验证

时间:2014-10-14 17:01:45

标签: c# .net authentication active-directory windows-authentication

我正在为离线应用程序实施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方法?

请提出任何建议 - 我并不特别希望我们的用户可以尝试一半的错误登录。

1 个答案:

答案 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.DomainSystem.DirectoryServices.ActiveDirectory.DomainController来获取此DomainManager.DomainName值。