APP下载

用C语言开发交互学习网络平台上的LDAP认证

2013-04-12白兴瑞a黄志强b

衡水学院学报 2013年4期
关键词:龙岩面向对象C语言

白兴瑞a,黄志强b



用C语言开发交互学习网络平台上的LDAP认证

白兴瑞,黄志强

(龙岩学院 a. 现代教育技术中心;b. 数学与计算机科学学院,福建 龙岩 364000)

在简要介绍LDAP的相关技术的基础上,用C语言开发LDAP实现面向对象的交互学习网络平台用户认证, 从而设计一种基于LDAP协议的,适用性广、通用性强的高效、安全的用户登录系统.

交互学习;网络平台;LDAP;C语言

1 问题的提出

面向对象的交互学习网络平台(虚拟学习环境),其目地是更好地让教师与学生在教学方面互动,最终更好地完成课程教学任务.学习平台系统中用户的登录认证模块是管理教师与学生平台的基础,在研发面向对象的交互学习网络平台时,为了更好地与学校其它信息系统共享信息资源,提出构建一个通用的、安全的、易于管理的、可扩展的统一用户认证管理组件.

2 LDAP

认证方式通常采用数据库的访问,但数据库的认证方式不局限于通信层数据服务,还需要该数据库所支持的接入方式,即需要安装相应的数据库客户端软件或者相应的驱动程序,其耦合度比较高.采用LDAP来管理认证信息时,对象所需的类名和属性定义得非常完善,数据的结构严格遵照国际规范事先设计好的;由于LDAP是目录访问协议,因此应用程序可以直接访问后台的目录服务来查询人员信息,而不必关心LDAP客户端或服务器,用户可以使用各种LDAP客户端访问不同的后台LDAP服务器.现在许多Server 端和Client 端应用程序或模组,如Microsoft 的Outlook、Active Directory与GNU的snedmail、ftpd 及系统上PAM账户、Openwebmail等,都可以同时用LDAP 的帐号密码认证.因此在交互学习网络平台上用户认证使用LDAP 作为程序开发依循的标准.

LDAP作为一个用户认证的解决方案,主要的优点还在于能够快速响应用户的查找需求,从LDAP服务器中读取数据比从专门为OLTP优化的关系型数据库中快一个数量级:比如用户的认证,会有大量的并发,由于数据库结构分成了各个表,每次都需要去搜索数据库,合成过滤,效率慢.虽然可以有Cache,但会有相应的安全问题.LDAP就是一张表,从效率和结构上都可以满足认证的需求.

3 设计原理

交互学习网络平台采用B/S模式,使用web代理层转发用户登陆信息到服务器扩展程序,服务器扩展程序把接收的用户请求转换到LDAP服务器完成相应的操作,操作结果送回服务器扩展程序,服务器扩展程序通过web服务器将其结果响应到web浏览器.LDAP验证模块向LDAP服务器的验证过程参见文献[3].

在编写LDAP客户端应用程序时,通常使用LDAP API与服务器交互.常见的API有C语言和Java语言两种,由于C语言API开发的代码执行效率很高,可以与早先的C/S结构代码兼容,与.NET环境集成度高,还可以用到一些特色功能的API,因此研究面向对象的交互学习网络平台时,用C语言开发LDAP.

4 系统实现

本系统采用的目录服务器是IBM Tivoli Dircetory Server(TDS),TDS是一个标准LDAP服务器产品,是一个基于 LDAP V3 的目录服务器,可用来创建目录服务.服务器端需要安装TDS服务器并创建实例,客户端需要安装TDS客户端及C语言开发工具并创建开发环境.因为在windows平台下,所以用VC++7(或以上)的开发工具,在客户端安装TDS的C客户端及Visual Studio2002开发环境.

在设计面向对象的交互学习网络平台的认证系统时,首先要建立组织模型,在这个组织模型基础上建立LDAP用户信息数据结构,对院系和学生、教师作为组织结构上的节点,院系之间的关系用结点的父子关系表示,学生、教师作为结点的子节点.院系和学生、教师定义各自的objectclass,用organizationunit和organizationperson来定义来保持与其它系统的信息的互通性.

1) 在服务器上创建TDS实例

在服务器上安装TDS产品后,通过idsicrt命令创建TDS实例.

idsicrt -n -l demo -e seedseedseed -g saltsaltsalt -i all -p 389 -s 636 -a 3538 -c 3539 -7 demo -l c:

2) 在客户端上创建LDAP项目

在visual studio IDE中创建一个win32项目,将其指定为“控制台应用程序”且为“空项目”,然后在“附加依赖项”中添加“libidsldap.lib, libibmldapdbg.lib, libidsldifstatic.lib”3个库文件.

3) 初始化LDAP环境

客户端在连接服务器之前要先进行初始化LDAP环境,设置LDAP服务器地址及端口、LDAP通信协议版本、LDAP操作的超时限制及返回条目上限等.通过ldap_init(ldap_host, LDAP_PORT)初始化LDAP环境,初始化操作并没有与服务器建立真正的TCP/IP连接,该连接会在绑定操作中建立.

4) 绑定与解绑

LDAP v3支持3种绑定认证:简单认证、通用认证、SASL认证.简单认证的API为ldap_simple_bind( ),使用时必须提供绑定连接的用户名和密码.SASL认证的API为ldap_sasl_bind( ),它需要提供认证机制和用户凭证.通用认证的API为ldap_bind( ),它可以通过验证方式参数来指定替代前两种认证中的一种.无论是哪种认证方式都需要提供绑定用户的DN和认证凭证.

ld=ldap_init(“localhost”,389);//连接成功后LDAP 服务器则会返回会话句柄

rc=ldap_simple_bind_s(ld, “cn=root”, “root”);//和服务器进行绑定

If(rc!=ldap_success)

{ fprintf(stderr, “error:ldap_simple_bind_s[%s] ”,ldap_err2string(rc));

exit(1)’}

……

rc=ldap_unbind_s(ld); /*用来与一个目录解绑定并关闭连接*/

if (rc!=ldap_success)

{ fprintf(stderr,”error:ldap_unbind_s[%s] ”,ldap_err2stromg(rc))’

Exit(1);} }

5) 搜索目录树

msgid=ldap_search(ld, “o=sample”, ldap_scope_subtree, “objectclass=*”, attrs,0); //搜索LDAP目录树,返回条目信息,并且验证提交信息是否和条目信息一致.如果一致则验证成功,不一致则认证失败

if (msgid=-1)

{ fprintf(stderr, “error:ldap_search_ext[%s] ”,ldap_err2string(rc));

Exit (1)}

……

While (1)

{ rc=ldap_result(ld, msgid, ldap_msg_one, null, &result);

If (rc=ldap_res_search_entry)

{ printldapresult(ls,result);

Ldap_msgfree(result);}

Else if (rc=ldap_res_search_reference)

{ ldap_parse_reference(ld,result,&referrals,null,1);

If (referrals!=null)

{ for (i=0; referrals[i]!=null; i++)

Fprintf (stderr,’unfollowd reference: %s ”.referrals[i]);

Ldap_value_firee(referrals); } }

Else

Break; }

6) 增加条目

增加条目除了需要提供条目的唯一标DN外,还需要提供一系列的属性名和值.

Msgid=ldap_add(ld, “ou=stuent,o=department”,mods); //ldap_add()异步操作,需要ldap_result()来获取操作结果.

If (msgid =-1)

{ fprintf(stderr,”error:ldap_add[%s],[%s] ”,ldap_err2string(ldap_get_errno(ld)));

Exit (1); }

Else

{ rc=ldap_result(ld.msgid,ldap_msg_all,null,&result);

Printf(“operation[%s] ”,getldapresultcode(rc));

Rc=ldap_parse_result(ld,result,&errcode,null,&errmsg,null,null,0);//ldap_parse_result()获取错误码和错误信息

Printldapresult(ld,result);

Ldap_msgfree(result); }

修改条目ldap_mod_relace()操作的属性可以是原有的,也可以是原先没的,

删除条目 ldap_delete(ld, char * dn_to_delete)

条目也可以使用 LDAP 协议通过网络装载数据,或通过 LDAP Data Interchange Format(LDIF) 格式的文件将数据导入服务器.在任何时候都可以使用 LDIF,比如在创建最初的树时,或者在以后某个时间批量添加数据或修改数据时.搜索的输出也可以保存为 LDIF 格式,这样可以方便解析或导入另一个服务器.

5 结束语

C语言API函数的输出参数会动态分配数据结构所需的内存,而C语言没有内存回收机制,最终会造成程序内存溢出.因此,对于基本数据结构的内存释放可以用ldap_value_free(), ldap_memfree(), ldap_ber_free(), ldap_control(), ldap_controls_free(); 对于复杂的数据或链式结构的内存释放可以用ldap_free_limit_num_values_ response(), ldap_free_soft_keylist(), ldap_free_query_plunig().另外,在缺省情况下ldap api输入输出参数都是utf-8编码格式,为了能接收本地字符集,必须设置选项ldap_opt_utf8_io为ldap_utf8_xlate_on, 编程时可以用 ldap_set_locale()设置本地字符集.

[1] 关婷婷,陈性元,张斌.基于XML 的数据表现格式在LDAP 目录中的应用[J].计算机工程与设计,2006,27(22):4383-4386.

[2] 吴杰明,周宁.基于LDAP 的信息共享平台研究与实现[J].计算机应用,2008,28(4):1042-1044.

[3] 王源. LDAP认证实现与性能分析[J].电子科技,2010(12):76-79.

Using C Language to Develop LDAP Certification on Interactive Learning Network Platform

BAI Xing-rui, HUANG Zhi-qiang

(a. Modern Educational Technology Center; b. Mathematics and Computer Science College, Longyan University, Longyan, Fujian 364000, China)

Based on the brief introduction of LDAP technology, develop LDAP with C language to get the user authentication on an object-oriented interactive learning network platform. The purpose is to design a user login system based on LDAP protocol, with wide applicability, strong commonality and safety.

interactive learning; network platform; LDAP; C language

(责任编校:李建明 英文校对:李玉玲)

TP393

A

1673-2065(2013)04-0024-03

2013-03-20

福建省教育厅B类科技项目(JB12196)

白兴瑞(1971-),男,福建龙岩人,龙岩学院现代教育技术中心高级实验师; 黄志强(1981-),男,福建龙岩人,龙岩学院数学与计算机科学学院讲师.

猜你喜欢

龙岩面向对象C语言
新时期单元控规动态维护探索实践——以龙岩主城区为例
基于Visual Studio Code的C语言程序设计实践教学探索
基于C语言的计算机软件编程
GPON技术在漳州天宝至龙岩蛟洋高速公路扩建工程中的应用
高职高专院校C语言程序设计教学改革探索
龙岩:“三色”发力 崛起提速
面向对象Web开发编程语言的的评估方法
基于面向对象的车辆管理软件的研制与开发
论子函数在C语言数据格式输出中的应用
面向对象的SoS体系结构建模方法及应用