博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ldap 身份验证的通用步骤
阅读量:5866 次
发布时间:2019-06-19

本文共 1344 字,大约阅读时间需要 4 分钟。

hot3.png

和利用数据库进行验证类似,LDAP中也是利用登陆名和密码进行验证,LDAP中会定义一个属性password,用来存放用户密码,而登陆名使用较多的都是mail地址。那怎么样才能正确的用LDAP进行身份验证呢,下面是一个正确而又通用的步骤:

       1. 从客户端得到登陆名和密码。注意这里的登陆名和密码一开始并没有被用到。

       2. 先匿名绑定到LDAP服务器,如果LDAP服务器没有启用匿名绑定,一般会提供一个默认的用户,用这个用户进行绑定即可。

       3. 之前输入的登陆名在这里就有用了,当上一步绑定成功以后,需要执行一个搜索,而filter就是用登陆名来构造,形如: "(|(uid=$login)(mail=$login))" ,这里的login就是登陆名。搜索执行完毕后,需要对结果进行判断,如果只返回一个entry,这个就是包含了该用户信息的entry,可以得到该entryDN,后面使用。如果返回不止一个或者没有返回,说明用户名输入有误,应该退出验证并返回错误信息。

       4. 如果能进行到这一步,说明用相应的用户,而上一步执行时得到了用户信息所在的entryDN,这里就需要用这个DN和第一步中得到的password重新绑定LDAP服务器。

       5. 执行完上一步,验证的主要过程就结束了,如果能成功绑定,那么就说明验证成功,如果不行,则应该返回密码错误的信息。

       5大步就是基于LDAP的一个 “两次绑定” 验证方法,下面这个图能更形象的说明这个过程:

 

 

 

 

        为什么基于LDAP进行验证需要“两次”绑定呢,为什么不能取出password然后和输入进行比较呢,试想一下,如果需要读出密码,服务器上的密码存储要么就不加密,直接可以读出,要么客户就需要知道服务器使用的加密方式,这是不安全,也是不好的,服务器不希望加密方式让客户端知道,客户端也不需要知道这么多。而从实际来看,LDAP服务器对于password属性默认都是不可读的,甚至有的服务器根本就不支持password属性可读,遇到这种情况,也就没有办法取得密码了。

       还有一个问题就是,为什么我们需要第一次绑定?为什么不直接使用DN呢,首先就是关于这个DN,对于一般的客户端程序,其并不知道具体的DN是什么。再者让用户输入DN,给用户带来不便的同时,验证也带来问题,因为如果输入的是个目录树而不是所期望的DN,在进行绑定时有可能会让服务器产生不可预料的错误。

       从上面看来,基于LDAP进行身份验证,最好也是最通用的方法就是 “两次绑定”。

 

 

 

所谓的bind是一个authentication的过程,不要把它想像成“绑定”,既然是认证,就需要一个用户名和密码,openldap中如果出示的用户名和密码错误,服务器会尝试匿名认证,就和匿名ftp一样。当然,在现实配置中可能需要在认证不获得成功就不能做查询操作,这些是在slapd.conf文件中通过设置ACL实现的。

 

 

认证所用的用户名和密码为目录树中某个节点的两个属性(用户名和密码),一般情况下,程序会默认使用uiduserPassword属性。写程序进行认证的时候只要提供这个节点的两个属性就可以了。

 

转载于:https://my.oschina.net/u/1044955/blog/277079

你可能感兴趣的文章
年少不被层楼误,余生不羁尽自由
查看>>
sqlserver 监控盘符空间大小
查看>>
Mysql常用命令锦集
查看>>
在Linux系统下一个网卡设置多个IP的方法
查看>>
SSH原理与应用.
查看>>
FFmpeg
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
《白帽子讲WEB安全》学习笔记之第12章 WEB框架安全
查看>>
小鸟chacha初学linux 文件查找、归档、压缩
查看>>
Fedora yum光盘安装及运行命令
查看>>
Linux开机自动启动脚本方法
查看>>
bootstrap框架的使用
查看>>
POJ 3130 How I Mathematician Wonder What You Are! 半平面交
查看>>
windows消息机制(MFC)
查看>>
代码中设置apk的安装路径
查看>>
刘宇凡:互联网思维之超出预期的用户体验
查看>>
Redis AOF持久化和RDB持久化区别
查看>>
Linux服务器安全策略
查看>>
让程序修改自己
查看>>