C# 为web应用程序自动验证ldap

C# 为web应用程序自动验证ldap,c#,authentication,hash,active-directory,ldap,C#,Authentication,Hash,Active Directory,Ldap,请花几分钟时间完整阅读我的问题。我的问题是: 我想通过C#连接到LDAP服务器,对于web应用程序,这意味着客户端连接到asp.net服务器 *-ldap服务器和应用程序服务器不同 **-它们不在同一个域中 我一直在尝试4种不同的方法,但都无法解决问题 1- 二,- 这两种方法的问题是,用户必须具有登录服务器的权限,并且我们知道只有系统管理员具有该权限 三,- 问题是服务器必须位于ldap服务器的域中。我们有这个限制 四,- 此代码不返回任何内容。如果有一个比较用户名和密码的查询,这将非常有用

请花几分钟时间完整阅读我的问题。我的问题是: 我想通过C#连接到LDAP服务器,对于web应用程序,这意味着客户端连接到asp.net服务器

*-ldap服务器和应用程序服务器不同

**-它们不在同一个域中

我一直在尝试4种不同的方法,但都无法解决问题

1-

二,-

这两种方法的问题是,用户必须具有登录服务器的权限,并且我们知道只有系统管理员具有该权限

三,-

问题是服务器必须位于ldap服务器的域中。我们有这个限制

四,-

此代码不返回任何内容。如果有一个比较用户名和密码的查询,这将非常有用。这段代码似乎使用这种方式,但有不同类型的散列算法。我尝试使用SHA1和MD5,以及userPassword和unicodePwd属性。但回报一直是空的


将两台服务器放在同一个域中是最好的解决方案吗?任何其他解决方案,非常感谢。

方法1是最简单的方法。如果这不起作用,什么都不会。因此,您必须更改配置以使其正常工作

当你说:

用户必须具有登录服务器的权限,并且我们知道只有系统管理员具有该权限

你什么意思?您是否明确拒绝域控制器的登录权限?正在运行此操作的计算机与域控制器之间是否存在网络问题(能否点击域控制器上的389端口)

更新:
PrincipalContext.ValidateCredentials
只是在后面进行LDAP绑定-它使用
LdapConnection
。你可以看到这张照片。
ValidateCredentials
在域计算机上工作而不是在域计算机上工作的可能原因是它默认使用Kerberos身份验证,而Kerberos身份验证只在域计算机上工作

LdapConnection
也是如此。因此,请尝试设置身份验证模式。例如,尝试
Basic

var credentials = new NetworkCredential(username, password);
var serverId = new LdapDirectoryIdentifier("domain.net");

var conn = new LdapConnection(serverId, credentials, AuthType.Basic);
conn.Bind();

或者尝试什么。

OK谢谢,看一下应用程序在服务器A上,LDAP数据库在服务器B上。例如,管理员可以用ActiveDirectory的用户通道登录LDAP。我可以通过我的电脑而不是任何其他电脑登录。因此,当我想作为客户端登录时,我没有通过web应用程序访问ldap的权限。如果我使用第3种方法,我们不需要有登录权限,但服务器A必须在服务器B的域中,如果我的解释还不清楚,请让我知道,我已经用我认为可能存在的问题更新了我的答案。太好了,差不多完成了!但我们这里只有一个人,他不能使用任何类型的身份验证登录系统。实际上,他只能用他的电脑登录,没有身份验证类型参数!!对于某些用户,身份验证类型是否可能与其他员工不同?有什么解决办法吗?因为在运行时,我不知道每个用户的身份验证类型,而且他们可能无法在其他PC上登录。非常感谢您,您可以将
Bind()
放入
try
/
catch
块中,然后用不同的方法重新测试。用你知道可能有效的所有方法重新测试。
System.DirectoryServices.DirectoryEntry entry = new System.DirectoryServices.DirectoryEntry("LDAP://domain.net/DC=domain,DC=net");
                entry.Username = "username";
                entry.Password = "password";
                System.DirectoryServices.DirectorySearcher searcher = new System.DirectoryServices.DirectorySearcher(entry);
                searcher.Filter = "(&(objectClass=user))";
                var results = searcher.FindAll();
   PrincipalContext pc = new PrincipalContext(ContextType.Domain, "domain.net");
   var ret = pc.ValidateCredentials(model.UserName, model.Password);
public bool validateUser(string username, string password)
{
    var sha1 = new SHA1Managed();
    var digest = Convert.ToBase64String(sha1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password)));
    var request = new CompareRequest(string.Format("uid={0},ou=users,dc=example,dc=com", username),
        "userPassword", "{SHA}" + digest);
    var response = (CompareResponse)connection.SendRequest(request);
    return response.ResultCode == ResultCode.CompareTrue;
}
var credentials = new NetworkCredential(username, password);
var serverId = new LdapDirectoryIdentifier("domain.net");

var conn = new LdapConnection(serverId, credentials, AuthType.Basic);
conn.Bind();