分享

单点登录的简单实现

 Joshua 2006-02-20
在门户项目中,经常会遇到如何实现单点登录的问题,下面就本人的经验做个总结。欢迎大家进行补充讨论。

单点登录的具体实现有很多种选择:包括:
a)  采用专门的SSO商业软件:  主要有:Netgrity的Siteminder,已经被CA收购。Novell  公司的iChain。RSA公司的ClearTrust等。
b)  采用门户产品供应商自己的SSO产品,如:IBM  的Tivoli  Access  Manager,Sun  公司的identity  Server,Oracle公司的OID等。
c)  这些商业软件一般适用于客户对SSO的需求很高,并且企业内部采用COTS软件如:Domino,SAP,Sieble的系统比较多的情况下采用。并结合身份管理。统一认证等项目采用。采用这些软件一般都要对要集成的系统做些改造,如在要集成的系统上安装AGENT。现在一般只提供常见软件如:Domino,SAP,Sieble,常见应用服务器:weblogic,websphere等的AGENT。要先统一这些系统的认证。一般采用LDAP或数据库。然后才能实现SSO。比较麻烦。
d)  另外,如果不想掏银子,也有OPEN  SOURCE的SSO软件可选:主要有:http://www./    https://opensso.dev./    http://www.  等。具体怎么样就不清楚了。

如果项目对SSO的要求比较低,又不想对要被集成的系统做任何改动,可采用下面介绍的方式简单实现:下面我们通过一个例子来说明。假如一个门户项目要对下面的几个系统做SSO。

 

用户在这些系统中的用户名,密码各不相同,如:员工号为001的员工在这些系统中的用户名,密码分别如下:  

用户  系统  用户名  密码  
001  Portal系统  A  1234  
001  邮件系统  B  23456  
001  DOMINO系统  C  ABCDE  
001  报销系统  D  CCCCC  
001  工资系统  E  DDDDD  



首先,建立员工在PORTAL系统中的用户名和其他系统中的用户名之间的对应关系

要建立员工在PORTAL系统中的用户名和其他系统中的用户名之间的对应关系并保存。可保存在表中或LDAP中或文件系统中。当然要考虑这些系统之间的数据同步问题。比较好的方式是找到用户在这些系统中的都存在的唯一信息(如员工号,MAIL地址,姓名等)。通过唯一信息实时到各个系统中去取认证所需要的信息。就不需要考虑数据同步问题。比较实用。可以建立类似下面的表:密码可采用加密保存。  


 create  table  sso_info          

 (

 

 user    varchar2(20),        /*用户名*/

 app_name  varchar2(20),      /*应用系统*/

 architect  varchar2(4),        /*应用系统的架构BS或CS*/

 app_company  varchar2(50),                    /*用户所属分公司*/

 app_department  varchar2(50),            /*用户所在的部门*/

 app_user  varchar2(15),                                  /*在该系统中的用户名*/

 app_passwd  varchar2(15),    /*在该系统中的密码*/

 app_cookie  varchar2(30),                            /*COOKIE名称*/

 form_user  varchar2(20),                                /*认证页面中FORM的用户名字段*/

 form_passwd  varchar2(20),                    /*认证页面中FORM的密码字段*/

 app_special    varchar2(20)                      /*其他*/

 );





通过IFRAME或超连接方式集成目标系统,并进行SSO

 通过IFRAME或超连接方式集成目标系统,并在URL中带上用户名和密码。如集成DOMINO可采用如下方式:  <iframe  style="BACKGROUND-COLOR:  #f7f7ff"  align="middle"  marginwidth="0"  marginheight="0"  src="http://host1/names.nsf?Login&Username=***&Password=pass&RedirectTo=/names.nsf"  frameborder="0"  width="100%"  scrolling="yes"  height="100%"  />


或:
<Href  src=“http://  host1/names.nsf?Login&Username=***&Password=pass&RedirectTo=/names.nsf”  />
以上采用的是在HTTP中直接传递明码,为提高安全性,可采用HTTPS来传递用户名和密码。另外采用这种方式被集成的系统必须支持FORM方式认证。J2EE应用,DOMINO等都支持FORM认证。
这两种方式如果SSO成功,就自动进入目标系统的界面,如果实现会显示目标系统的登录界面。其效果图如下:

 


这种方式,必须维护对应关系表,如上面的sso_info。更好的方式是提供界面,让最终用户自己维护这种对应关系,可模仿Compoze  portlets  for  lotus的做法,在用户第一次进入要与之做SSO的系统时,如DOMINO系统,显示一个界面,让用户自己输入他在该系统中的用户名/密码等信息。并保存到表中或LDAP等其他数据源中。以后用户要进入这些系统时,就直接从表中或其他数据源中取用户的用户名/密码等信息,帮助用户做认证。建议采用这种方式。如下图所示。如果用户改变了自己在DOMINO系统中的用户名,密码。从门户系统进入DOMINO系统时,认证会失败,就重新显示类似下面的界面。让用户重新输入他在DOMINO系统中新的用户名,密码并保存。


 

以上这种实现方式,一般需要浏览器支持COOKIE,所以要注意浏览器的配置,在开发阶段,为方便调试,可设置IE,让它显示COOKIE的名称。如下所示:

 



采用这种方式,对要集成的系统不需要做任何的改动。如果PORTAL系统中的用户在被集成的系统中的权限都一样,可采用建立一个通用用户的做法。也就是所有在PORTAL系统中的用户都采用这个通用用户进入目标系统。这种方式等于是采用页面集成方式做集成。比较方便使用。另外,有时候需要采用调用API,或配置Adapter等应用集成方式来集成其他系统,一般也是通过定义一个连接专用的用户。在API中或在配置Adapter的时候写死。如采用JAVA  API方式集成DOMINO:

lotus.domino.Session  dominoSession  =  NotesFactory.createSession(dominoServer,  “***”,  “password”);





CS结构实现方式


经常有人问CS结构的应用如何实现SSO,本人的建议是对这种系统不要自己去实现SSO。很麻烦,其实输个用户名,密码没什么大不了的。如果要实现,一是采用商业软件。另外也可以采用以下方式:在PORTAL的PORTLET上建立超连接。并通过APPLET方式启动CS结构的应用系统的登录界面。然后通过如下的方式把用户名/密码传递过去。
 -不能做任何改动的客户端  -  WIN消息(给登录窗口发送用户名,密码等登录所需要的信息),模拟键盘(java有模拟键盘输入的API)
 -可以做改动的客户端  -  参数传递,并让登录的EXE文件读取参数进行认证。
因为要让APPLET执行本地的EXE文件,所以必须对IE中的JRE的安全进行设置。    




其他:
在采用以上方式实现了SSO后,要注意LOGOUT,可采用与LOGIN相同的方式。也可以通过被集成系统的超时设置来实现。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多