c# - 使用 C# 根据 LDAP 对用户进行身份验证

标签 c# authentication ldap

我正在使用 DirectorySearcher 在 LDAP 服务器中搜索用户条目。

DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://myserver/OU=People,O=mycompany";
de.AuthenticationType = AuthenticationTypes.None;

DirectorySearcher deSearch = new DirectorySearcher();

deSearch.SearchRoot = de;
deSearch.Filter = "(uid=" + model.UserName + ")";

SearchResult result = deSearch.FindOne();

我能够在结果变量中获得预期的输出。
但是,如果我尝试通过在目录条目中提供密码来验证同一用户,我总是会收到以下错误。

“用户名或密码不正确。”

DirectoryEntry entry = new DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);
DirectorySearcher search = new DirectorySearcher(
    entry,
    "(uid=" + username + ")",
    new string[] { "uid" }
);

search.SearchScope = System.DirectoryServices.SearchScope.Subtree;
SearchResult found = search.FindOne();   ->>>>>this is where I get wrong credential error.

用户名和密码用于我要验证的用户。

任何人都可以告诉我我在这里做错了什么或如何调试它。

最佳答案

此行内的用户名、密码:

DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);

应该用于具有目录查找权限的帐户。它可能是服务帐户或测试目的,请尝试使用您自己的帐户。这不应该是您要验证身份的人的用户/通行证。

如果要进行身份验证,可以使用 PrincipalContext 使用以下步骤:

using(var context = new PrincipalContext(ContextType.Domain, "mydomain", "mydomain\serviceAcct", "serviceAcctPass")) {
 //Username and password for authentication.
 return context.ValidateCredentials(username, password); 
}

“serviceAcct”= 具有目录查找权限的域用户中的帐户。 “serviceAcctPass”= 该服务帐户的密码。 正如我所说,为了进行测试,您可以尝试使用自己的用户/密码上下文。

此外,确保提供的用户名具有“域\用户名”或“用户名@域”格式。

关于c# - 使用 C# 根据 LDAP 对用户进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561689/

相关文章:

c# - 在详细部分删除 Crystal 报告中的额外行

c# - Unity for Android - 对象不跟随触摸输入

php - Codeigniter 创建 session 和重定向在 IE 中不起作用

facebook - 签名请求 json 字符串不完整?

java - 是否可以使用 Jasper Reports 从 LDAP 生成报告

tomcat kerberos认证+ldap授权

c# - 如何使用 C# 删除 Windows 用户帐户文件夹?

c# - 如何在 SharpDevelop 4.2 中启动一个国际化的 WPF 项目?

java - OpenId 连接 Google 和 linkedIn

ldap - Gitlab: LDAP "Invalid credentials",但凭据是正确的