【问题标题】:Authentication via LDAP通过 LDAP 进行身份验证
【发布时间】:2011-05-25 22:49:53
【问题描述】:

我对其他人如何编写代码很感兴趣,因为我要么没有正确理解它,要么我遗漏了一些东西,或者我什至做得对!

首先,这不是 LDAP 的 Active Directory 实例,它是 OpenDS,除了一些语法差异之外,这并不重要。

所以假设我的树结构设置是这样的:

-dc=somedomain,dc=com
-uid=rootuser
    -ou=Group1
       -uid=username1
       -uid=username2
    -ou=Group2
       -uid=username3
       -uid=username4

为了以“rootuser”身份进行身份验证,我需要在创建 System.DirectoryServices.DirectoryEntry 对象时传递完全限定的用户名,在这种情况下:

uid=rootuser,dc=somedomain,dc=com

但是对于树中的任何其他用户,我必须提前知道要附加到用户名的 LDAP 路径以让他们通过身份验证。因此,例如这将失败:

uid=username1,dc=somedomain,dc=com

但这会起作用:

uid=username1,dc=somedomain,dc=com,ou=Group1

所以我的问题是,当您在登录时不知道用户属于哪个特定组来构建该路径时,您如何处理?我能想到的唯一方法是将初始调用作为“rootuser”进行,这样我就可以访问整个树,然后使用 System.DirectoryServices.DirectorySearcher 扫描该特定用户(即 username1)

using (DirectorySearcher searcher = GetDirectorySearcher()) {
    searcher.Filter = "(&(objectClass=person)(uid=" + userName+ "))";
    SearchResult result = searcher.FindOne();
    return result.GetDirectoryEntry().Path;
}

此时我有了我想要登录的用户的路径,我可以继续进行实际的身份验证。我是不是在这里偏离了基地,或者这通常是如何完成的?

谢谢!

【问题讨论】:

    标签: authentication ldap opends


    【解决方案1】:

    您根据用户独有的属性构建搜索过滤器,例如网名、电子邮件。确保配置 LDAP 以确保它们是唯一的。然后找到相应的条目(如果有),获取 DN,并使用适当的密码重新绑定为该用户。如果没有这样的条目,您会做出相应的反应。

    您没有说您使用的是什么语言,但在 JNDI 中,这意味着将 DN 设置为安全主体,将密码设置为凭据,并调用 LdapContext.reconnect()。

    【讨论】:

    • System.DirectoryServices 是 .NET 框架的一部分,如果不清楚,请见谅。所以听起来我根据你所说的正确地做这件事。是的,uid 是这个对象的唯一标识符,谢谢
    【解决方案2】:

    SASL 支持使用用户名进行身份验证的概念。您的目录服务器管理员可能能够配置目录服务器以将专有名称映射到身份。给定正确的映射,客户端可以在不知道专有名称的情况下进行身份验证。专业品质的目录服务器支持多种不同的映射机制,例如 direct mappingexact matchregular expression 或自定义身份映射器。

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多