2

我正在尝试修改基于 python 的身份验证器以用于 murmur(voip 软件)以与我的 ldap 树一起使用。

LDAP 身份验证器可在以下位置获得:

http://www.winex.org/linux/zealot/src/mumble-scripts/Authenticators/LDAP/LDAPauth.py

它可以工作,但不太适合我的 ldap 布局,所以我必须对其进行一些修改。我知道一种可行的方法,但不幸的是,我对 python 的了解并不比我从谷歌学到的更多(不过我还有一些其他的编程专业知识)。

我的 ldap 布局如下所示:

charName=xxx, ou=people, dc=xxx, dc=com

在此之下,存储了诸如此类的userPassword属性login

上面的 python 脚本被定制为使用 ldap 绑定来进行身份验证。在这种情况下,我必须绑定为"charName=logindatafromapp, ou=people, dc=xxx, dc=com". 不幸的是,人们不会登录,"charName"但使用"login"which 是一个属性,但与"charName".

我不知道绑定到属性的方法,所以这是我的想法:

  • 我首先以 ldap admin 身份绑定,然后搜索所有条目"logindatafromapp"并将该值与"login". 如果找到匹配项,我会抓取匹配项并按照最初的预期"charName"重新绑定。charName

我目前坚持查询该"charName"值并将该值分配给一个变量,所以我可以在第二个 ldap 绑定中使用它(谷歌并没有真正帮助我)。

这是我的代码:

ldap_conn = ldap.initialize(ldap_uri, 0)
ldap_conn.bind_s("cn=admin,dc=xxxxxxxx,dc=com","pass")
res = ldap_conn.search_s('ou=people,dc=xxxxxx,dc=com', ldap.SCOPE_ONELEVEL,'login=trony',['charName'])
print(res)

然后打印"[('charName=Trony,ou=people,dc=xxxxxxx,dc=com', {'charName': ['Trony']})]".

( "login=trony") 是一个临时过滤器,我必须用apploginvar 替换它。我现在的问题是如何将"Trony"(在这种情况下)分配给变量?输出似乎是一个特殊的结构?

4

2 回答 2

3

“特洛尼”在

res[0][1]['charName'][0]

你取列表的第一个元素——它是一个元组;然后是元组的第一个元素;这是一本字典;然后是键 'charName' 的字典值;这又是一个清单;然后是列表的第一个元素。

于 2012-07-01T16:18:23.513 回答
0

至少有两种选择:

  • 使用您描述的方法使用您拥有的信息搜索条目,在这种情况下是login用户输入的属性值,然后使用在简单或 SASL 绑定中找到的 DN 或
  • 使用带有身份映射的 SASL 来映射 authId(login属性的值),这样 SASL 绑定将在只有login属性值已知的情况下成功

第一种方法需要搜索然后绑定,第二种方法可能要求用户条目具有可逆密码(AES 是用于此目的的良好加密方案),具体取决于所选的 SASL 机制。使用带有 DIGEST-MD5 机制的 SASL 将提供一种映射身份的方法(所有专业质量的 LDAP 服务器都支持这种映射机制),并且无需通过网络以明文形式发送密码,但有缺点不像使用简单绑定那样安全,其中密码存储为加盐 SHA-2 摘要。尽管不应该使用 DIGEST-MD5,因为它需要可逆密码,因此不如使用强 SHA-2(带盐)安全,但它可用于需要它的应用程序。

于 2012-07-02T01:40:22.137 回答