C# 如何在.NET中验证LDAP

C# 如何在.NET中验证LDAP,c#,ldap,novell,C#,Ldap,Novell,我想在windows操作系统上使用任何目录服务验证我的应用程序的用户名和密码。例如,它可以是microsoft active directory、Novell eDiscovery或SunOne。我已经知道如何使用c#为Microsoft Active Directory编写本机代码。(我完全放弃了使用ADSI和创建低级com组件) 我试图通过Novel eDirecotory进行身份验证的方式是我已经安装了Mono项目。在mono项目中,它们为您提供Novell.Directory.ldap.

我想在windows操作系统上使用任何目录服务验证我的应用程序的用户名和密码。例如,它可以是microsoft active directory、Novell eDiscovery或SunOne。我已经知道如何使用c#为Microsoft Active Directory编写本机代码。(我完全放弃了使用ADSI和创建低级com组件)

我试图通过Novel eDirecotory进行身份验证的方式是我已经安装了Mono项目。在mono项目中,它们为您提供Novell.Directory.ldap.dll,代码看起来与Microsoft Active Directory的代码有些相同。()

对于SunOne,我被告知使用与activedirecotry相同的代码,但是ldap connecton字符串有点不同。() ()

使我的项目复杂化的是,大多数客户使用“服务帐户”:这意味着我需要先绑定管理用户名和密码,然后才能验证常规用户名和密码。我的问题分为两部分

1) 根据我上面的解释,这是我应该针对每个单独的direcotory服务进行身份验证的正确方向吗

2) 我觉得我根本不需要做这些代码。我也觉得使用服务帐户的规定一点也不重要。如果我所关心的只是在windows计算机上验证用户名和密码,为什么我甚至需要使用ldap?我是说好好想想。当您早上登录到您的机器时,您不必提供服务帐户即可登录。通过使用runas功能,我可以在DOS提示下轻松地验证用户名和密码,我将被拒绝或不拒绝,并且可以解析文本文件。我确信还有其他方法可以将用户名和密码传递给我所在的windows操作系统,并告诉我用户名和密码是否对它所在的域有效。我说得对吗?如果是,你们有什么建议的方法

迈克尔·埃文奇克
www.MikeEvanchik.com

我不确定自己是否完全理解这个问题,但在某些情况下,我发现只需搜索用户的帐户并将其凭据用作用户名和密码,就可以轻松地对用户进行身份验证

成功的查询意味着提供的一切都是正确的,没有找到帐户意味着有问题

//use the users credentials for the query
DirectoryEntry root = new DirectoryEntry(
    "LDAP://dc=domain,dc=com", 
    loginUser, 
    loginPassword
    );

//query for the username provided
DirectorySearcher searcher = new DirectorySearcher(
    root, 
    "(sAMAccountName=" + loginUser + ")"
    );    

//a success means the password was right
bool success = false; 
try {
    searcher.FindOne();
    success = true;
}
catch {
    success = false;
}

可能不是“最佳实践”,但可能会解决您的问题…

我们有一个网站,需要根据域凭据验证用户名和密码,并使用LogonUser API函数。将它用于网络登录(其中一个参数是logon type),它所做的只是验证凭据,而不是像runas那样加载用户配置文件。
唯一需要注意的是,服务帐户确实需要足够的访问权限才能调用LogonUser。我建议您查看MSDN文档以了解该访问是什么,因为它因操作系统而异。

所有这些都可以通过System.DirectoryServices.Protocols完成。如果创建到目录的LdapConnection,则可以使用服务帐户进行绑定,然后进行后续绑定以验证凭据

服务帐户通常用于限制对服务器的身份验证机制的访问。这样,街上的任何随机人都无法尝试使用LDAP服务器进行身份验证

另外,您是否希望每个用户在登录时都提供自己的专有名称?对于Active Directory,只需要sAMAccountName,而其他提供程序(如eDirectory和SunONE)则需要可分辨名称进行身份验证

要执行这种类型的身份验证,您需要使用提供给服务器的服务帐户进行身份验证,搜索具有给定用户名的用户,并获取该用户的专有名称。然后,您可以使用提供的可分辨名称和密码进行身份验证


这将适用于所有LDAP系统,但Active Directory除外,Active Directory只对sAMAccountName感到满意。

我假设上面是microsoft AD,并且正在使用LDAP。谢谢你的密码。我的问题更像是一种普遍使用的方式,可能不使用LDAP,因为有些LDAP服务器需要服务帐户用户名和密码,只是为了绑定,所以您甚至可以尝试验证普通用户。这就是我的建议-使用登录用户的凭据(假设您询问他们的用户名和密码)作为服务帐户。用户至少应该能够查询和查看自己的帐户。如果这样做有效,那么您就知道身份验证是有效的。这似乎是一个相当普遍的检查密码是否正确的方法。谢谢你引导我走上正确的道路。虽然你是对的,但是你需要本地管理员来进行这个api调用,谷歌搜索,如果你读了这个帖子,他们说有一个api调用不需要这个AcquireCredentialHandlent with is in security.dllIf如果你在2003,那么LogonUser不需要SE_TCB_名称。我不认为只要调用AcquireCredentialsHandle就可以检查它们是否有效。代码正在模拟完整的客户端/服务器身份验证检查。不过,除了明显的代码负载之外,我看不出有什么问题。