首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.NET中验证LDAP

如何在.NET中验证LDAP
EN

Stack Overflow用户
提问于 2009-04-20 17:23:29
回答 3查看 45K关注 0票数 15

我想用任何目录服务在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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-07 19:54:20

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

服务帐号通常用于限制对服务器的身份验证机制的访问。这样,大街上的任何人都不能尝试使用您的LDAP服务器进行身份验证。

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

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

这将适用于所有的LDAP系统,除了Active Directory,它只需使用sAMAccountName即可。

票数 4
EN

Stack Overflow用户

发布于 2009-04-20 17:36:56

我不确定我是否完全理解这个问题,但在某些情况下,我发现只需搜索用户的帐户并使用他们的凭据作为用户名和密码,就可以很容易地对用户进行身份验证。

成功的查询意味着所提供的一切都是正确的,而找不到帐户则意味着出了问题。

代码语言:javascript
复制
//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;
}

可能不是“最佳实践”,但可以绕过你遇到的问题……

票数 12
EN

Stack Overflow用户

发布于 2009-04-20 17:54:05

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/769268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档