15

我想在具有任何目录服务的 Windows 操作系统上验证我的应用程序的用户名和密码。例如,它可以是 microsoft Active Directory、Novell eDirecotry 或 SunOne。我已经知道如何使用 c# 为 Microsoft Active Direcotry 本地执行此代码。(我完全放弃了使用 ADSI 并创建了一个低级 com 组件)

我尝试使用 Novel eDirecotory 进行身份验证的方式是我安装了 Mono 项目。在 mono 项目中,他们为您提供 Novell.Directory.ldap.dll 代码看起来与 Microsoft Active Directory 的代码有些相同。( http://www.novell.com/coolsolutions/feature/11204.html )

对于 SunOne,我被告知使用与活动目录相同的代码,但 ldap 连接字符串有点不同。(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

4

3 回答 3

12

我不确定我是否完全理解这个问题,但在某些情况下,我发现通过简单地搜索他们的帐户并将他们的凭据用作用户名和密码来验证用户很容易。

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

//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-20T17:36:56.493 回答
4

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

服务帐号一般用于限制访问服务器的认证机制。这样,街上的任何人都无法尝试使用您的 LDAP 服务器进行身份验证。

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

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

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

于 2009-05-07T19:54:19.677 回答
0

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

于 2009-04-20T17:54:05.220 回答