C# 使用 System.DirectoryServices.Protocols 针对 MS Active Directory 服务器验证用户
Posted
技术标签:
【中文标题】C# 使用 System.DirectoryServices.Protocols 针对 MS Active Directory 服务器验证用户【英文标题】:C# Validate User against the MS Active Directory Server using System.DirectoryServices.Protocols 【发布时间】:2019-12-10 09:57:12 【问题描述】:我想针对 MS Active Directory 服务器对用户进行身份验证。
由于有两个可用的命名空间,我想使用 System.DirectoryServices.Protocols。
当前我正在使用以下代码验证用户
var valid = false;
var credentials = new NetworkCredential("user01", "password01");
var serverId = new LdapDirectoryIdentifier("192.168.1.21:389");
var conn = new LdapConnection(serverId, credentials);
try
conn.Bind();
valid = true;
catch
上面的代码正确地验证了用户,但它也验证了旧密码。
我怎样才能摆脱这个?
我检查了以下问题
Validate a username and password against Active Directory?
Why does Active Directory validate last password?
【问题讨论】:
【参考方案1】:您链接到的第二个问题中的highest voted answer 包含您需要知道的一切。允许使用旧密码的唯一方法是 NTLM 是使用的身份验证机制。如果你想阻止这种情况,你必须告诉它只使用 Kerberos 而不是 NTLM:
var conn = new LdapConnection(serverId, credentials, AuthType.Kerberos);
我看到您对该答案的评论,并说即使使用正确的密码,所有身份验证都会失败。这只是意味着 Kerberos 身份验证不起作用。那是另一个故障排除混乱。如果您正在运行它的服务器与您正在验证的用户加入相同(或受信任的)域,那么 Kerberos 确实没有理由不工作。但如果服务器在域外,设置 Kerberos 可能会很麻烦。
这里有一些阅读:
Kerberos Troubleshooting Troubleshooting Kerberos Authentication problems – Name resolution issues或者您可能决定忽略这一点并让它使用 NTLM。无论如何,它只允许在更改后 1 小时内使用旧密码。
【讨论】:
以上是关于C# 使用 System.DirectoryServices.Protocols 针对 MS Active Directory 服务器验证用户的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# GUI 调用 C# 控制台应用程序 [重复]