【问题标题】:How to Authenticate LDAP in .NET如何在 .NET 中验证 LDAP
【发布时间】:2012-12-08 14:50:31
【问题描述】:

我想在具有任何目录服务的 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 操作系统,并会告诉我用户名和密码是否对它所在的域有效。我对吗?如果是这样,你们有什么建议的方法?

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

【问题讨论】:

    标签: c# ldap novell


    【解决方案1】:

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

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

    //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;
    }
    

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

    【讨论】:

    • 我假设上面只是 microsoft AD,并且正在使用 LDAP。感谢您的代码。我的问题更多的是一种普遍的方式,可能不使用 LDAP,因为某些 LDAP 服务器需要服务帐户用户名和密码,只是为了绑定,所以你甚至可以尝试对普通用户进行身份验证。
    • 这就是我的建议 - 使用登录用户的凭据(假设您要求他们的用户名和密码)作为服务帐户。至少应该能够查询和查看自己的帐户。如果这有效,那么您就知道身份验证有效。这似乎是一种检查密码是否正确的相当普遍的方法。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 感谢您带领我走上正确的道路。尽管您是对的,但您需要本地管理员才能进行此 api 调用,谷歌搜索,如果您阅读此线程,他们会说有一个不需要此vbforums.com/showthread.php?t=240277 AcquireCredentialsHandleNT 的 api 调用在 security.dll 中
      • 如果您使用的是 2003,那么 LogonUser 不需要 SE_TCB_NAME。我认为仅调用 AcquireCredentialsHandle 不会检查它们是否有效。该代码正在模拟完整的客户端/服务器身份验证检查。除了明显的代码负载之外,看不出有什么问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2016-10-30
      • 1970-01-01
      相关资源
      最近更新 更多