我想用任何目录服务在windows操作系统上验证我的应用程序的用户名和密码。例如,它可以是microsoft active directory、Novell eDirecotry或SunOne。我已经知道如何用c#为微软的活动目录原生做这段代码。(我完全放弃了使用ADSI和创建一个低级com组件)
我尝试使用新颖的eDirecotory进行身份验证的方法是,我已经安装了Mono项目。在mono项目中,他们为您提供了Novell.Directory.ldap.dll,代码看起来与Microsoft Active Directory的代码有点相同。(http://www.novell.com/coolsolutions/feature/11204.html)
对于SunOne,我被告知要使用与活动目录相同的代码,但ldap connecton字符串略有不同。(http://forums.asp.net/t/354314.aspx) (http://technet.microsoft.com/en-us/library/cc720649.aspx)
使我的项目复杂化的是,大多数客户使用“服务帐户:”,这意味着我需要绑定管理用户名和密码,然后才能对常规用户名和密码进行身份验证。我的问题分为两部分。
1)根据我上面的解释,这是我应该针对每个单独的目录服务进行身份验证的正确方向吗?
2)我觉得我根本不需要做这些代码。我也觉得使用服务帐户的规定并不重要。如果我所关心的只是在windows机器上验证用户名和密码,那么我为什么还要使用ldap呢?我是说想一想。当您在早上登录到您的计算机时,您不必提供服务帐户才能登录。通过使用runas功能,我可以在DOS提示符下轻松地验证用户名和密码,我将被拒绝或不被拒绝,并可以解析文本文件。我确信还有其他方法可以将用户名和密码传递给我所在的windows操作系统,并告诉我用户名和密码对于它所在的域是否有效。我说的对吗?如果是这样,你们有什么建议的方法吗?
Michael Evanchik www.MikeEvanchik.com
发布于 2009-05-07 19:54:20
所有这些都可以使用System.DirectoryServices.Protocols来完成。如果创建目录的LdapConnection,则可以使用服务帐户进行绑定,然后进行后续绑定以对凭据进行身份验证。
服务帐号通常用于限制对服务器的身份验证机制的访问。这样,大街上的任何人都不能尝试使用您的LDAP服务器进行身份验证。
另外,您是否希望每个用户在登录时都提供他们的可分辨名称?对于Active Directory,只需要sAMAccountName,而其他提供程序,如eDirectory和SunONE,则需要可分辨名称进行身份验证。
要执行这种类型的身份验证,您需要使用提供的服务帐户向服务器进行身份验证,搜索具有给定用户名的用户,并获取该用户的可分辨名称。然后,您可以使用该可分辨名称和提供的密码进行身份验证。
这将适用于所有的LDAP系统,除了Active Directory,它只需使用sAMAccountName即可。
发布于 2009-04-20 17:36:56
我不确定我是否完全理解这个问题,但在某些情况下,我发现只需搜索用户的帐户并使用他们的凭据作为用户名和密码,就可以很容易地对用户进行身份验证。
成功的查询意味着所提供的一切都是正确的,而找不到帐户则意味着出了问题。
//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;
}可能不是“最佳实践”,但可以绕过你遇到的问题……
发布于 2009-04-20 17:54:05
我们有一个网站,它需要根据域凭据验证用户名和密码,并使用LogonUser应用编程接口函数。使用它进行网络登录(它的参数之一是logon type),它所做的只是验证凭据,而不是像加载runas那样加载用户配置文件。唯一需要注意的是,服务帐户需要有足够的访问权限才能调用LogonUser。但是,我建议您查看MSDN文档,了解该访问是什么,因为它因操作系统而异。
https://stackoverflow.com/questions/769268
复制相似问题