我想在Windows操作系统上使用任何目录服务验证我的应用程序的用户名和密码。例如,它可以是microsoft active directory,Novell eDirecotry或SunOne。我已经知道如何使用c#本地为Microsoft Active Direcotry执行此代码。 (我完全放弃使用ADSI并创建一个低级别的com组件)
我尝试使用Novel eDirecotory进行身份验证的方式是我安装了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操作系统,并告诉我用户名和密码是否对其所在的域有效。我对吗?如果是这样,你们有什么建议的方式?
迈克尔·埃万奇克 www.MikeEvanchik.com答案 0 :(得分:11)
我不确定我是否完全理解这个问题,但在某些情况下,我发现只需搜索其帐户并使用其凭据作为用户名和密码即可轻松验证用户身份。
成功的查询意味着提供的所有内容都是正确的,找不到帐户意味着出错了。
//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;
}
可能不是“最佳做法”,但可能会解决您遇到的问题......
答案 1 :(得分:3)
所有这些都可以使用System.DirectoryServices.Protocols完成。如果您为目录创建LdapConnection,则可以使用服务帐户进行绑定,然后进行后续绑定以验证凭据。
服务帐户通常用于限制对服务器身份验证机制的访问。这样,街上没有随机的人可以尝试使用您的LDAP服务器进行身份验证。
另外,您是否希望每位用户在登录时都能提供其专有名称?使用Active Directory时,只需要sAMAccountName,但eDirectory和SunONE等其他提供程序需要使用专有名称进行身份验证。
要执行此类型的身份验证,您需要使用提供的服务帐户对服务器进行身份验证,搜索具有给定用户名的用户,并获取该用户的可分辨名称。然后,您可以使用该专有名称和提供的密码进行身份验证。
这适用于所有LDAP系统,但Active Directory除外,它只对sAMAccountName感到满意。
答案 2 :(得分:0)
我们有一个网站需要根据域凭据验证用户名和密码,并使用LogonUser API函数。使用它进行网络登录(其中一个参数是登录类型),它所做的只是验证凭据,它不会像加载runas那样的用户配置文件。 唯一需要注意的是服务帐户确实需要足够的访问权来调用LogonUser。我建议您查看MSDN文档,了解该访问的内容,因为它因操作系统而异。