关于SSO(单点登录),百度百科解释如下 :
总结出几个要素:
- 多个应用系统 (本文中局限于专属web类B/S信息业务系统)。 -- 针对的现实业务场景
- 只需成功登录一次(可以在应用系统各自的登录界面登录,亦可在统一认证服务器登录界面登录)。 -- 要达到的目的:简单、易用、人性化
- 认证服务器集中统一发放票据ticket。 -- 关键流程1:发票
- 各个业务系统对ticket提取、认证服务器再识别、信任互访。 -- 关键流程2:认票
- 并非必须将所有的用户信息集中存储处理于单一的用户信息数据库。 -- 非必要前提
- 多个应用系统中的不同账户统一映射集中于认证服务器。 -- 技术实现的关键前提
设计开发这个Demo的基本原则:花最小的改造代价实现新、老web信息业务系统融入到SSO大系统中,成为SSO大系统下的各种大、小B/S业务子系统、子站点的聚合,用户使用SSO大系统里的各项web业务子系统功能时,只需登录认证成功一次,就可以在SSO大系统下的子系统间,无缝跳转、自由切换游弋。做到改造代价最小、安全、高效、便捷、易使用、易扩展。
如果面对的业务场景是这样的,某组织或者集团先后上马投入运营了不同公司采用不同技术(本文狭义上指:asp、asp.net、PHP、JSP)开发的各样B/S的业务信息系统,每个系统有自己的用户登录模块和权限分配管理控制模型,后来又准备上马的新业务系统打算集中用户与权限控制管理于统一的数据库,当然仍可以各自为政,各搞各的用户与权限管理。如果有条件对各个业务信息系统做小许的变动(代码级的调整变动)以实现SSO,本文案例Demo可以提供一些参考。
Demo文件目录结构如下:
- SSODemo
- DB(SQLServer数据库备份)
- SSOServerDemo.bak -- 认证服务器演示数据库:用户表、UserID映射表、账户登录记录表
- testSSOSite1.bak -- 站点1的演示数据库:用户表
- testSSOSite2.bak -- 站点2的演示数据库:用户表
- SSOServerDemo(统一认证服务器)
- Login.aspx -- 认证服务器,集中统一登录界面,站点New跳转此,使用此界面登录
- UserMapping.aspx -- 将站点1、2、New的账号统一映射,成功后存入SSOServer数据库UserID映射表
- addNewSiteUser.aspx -- 将后续新站点的新账号加入统一映射,成功后存入SSOServer数据库UserID映射表
- InvalidUserId.aspx -- 失效某站点中的某账号
- authorizationCookie.aspx -- 发放统一认证票据
- httpGetCookie.aspx -- 获取SSOServer域下的认证Cookie票据
- pollingSession.aspx -- 刷新Session会话
- pollingSession.asmx -- 刷新在线用户状态数据
- abandonSession.aspx -- 更新在线用户会话状态表记录,删除会话票据
- GetUserIdByRecordID.aspx -- 验证票据,成功后,返回站点用户对应的UserID
- checkUserID.asmx -- 验证UserID是否被篡改过
- SSOSitesXML.config -- SSO中各个站点的IP及端口配置
- testSSOApplication1(代表旧有的B/S信息系统1)
- login.aspx
- PageBase.cs
- verifyUser.asmx -- 验证用户名、密码通过后,返回该账号对应UserID
- pollingSession.ashx -- 刷新用户会话状态
- GetCookie.aspx -- 跨域取Cookie票据,送往SSOServer,验证通过后,返回用户在该站点的UserID,产生Session["userId"]
- abandonSession.aspx -- 删除Cookie票据和Session
- ClearSession.aspx -- 清除Session
- getEncryptPWD.aspx -- 获取某账号在该站点对应的加密后的密码字符串内容
- getSSOServerIP.ashx -- 获取SSOServerIP
- getRemoteCookie.js、pollingSession.js、abandonSession.js -- 相关的关键JS文件
- testSSOApplication2(代表旧有的B/S信息系统2)
- login.aspx
- PageBase.cs
- verifyUser.asmx
- pollingSession.ashx
- GetCookie.aspx
- abandonSession.aspx
- ClearSession.aspx
- getEncryptPWD.aspx
- getSSOServerIP.ashx
- getRemoteCookie.js、pollingSession.js、abandonSession.js
- testSSOApplicationNew(代表新上的B/S信息系统New)
- PageBase.cs
- pollingSession.ashx
- GetCookie.aspx
- abandonSession.aspx
- ClearSession.aspx
- getSSOServerIP.ashx
- getRemoteCookie.js、pollingSession.js、abandonSession.js
测试前的先期工作,首先到SSOServer的UserMapping.aspx页面,建立各站点账号的统一映射。本Demo中,Site1为账号:site1 密码:site1,Site2为账号:site2 密码:site2,SiteNew为账号:siteNew 密码:siteNew。若有新站点新账号加入SSO,请到SSOServer的addNewSiteUser.aspx选择相应站点加入新账号进行映射。SSOServerDemo.bak的UserID映射表已存在测试账号的映射记录,各位看官测试时,不必再次映射。
注意:测试前请先修改站点的IP配置,各个站点项目中都静态引用了一些web服务,请配置好各个站点的IP及端口后,在VS中更新引用这些web服务。各个站点的IP配置信息在SSOSitesXML.config、appSettings.config、Web.config这几个文件中。
对于Site1、Site2的流程如下:
PageBase.cs会检查 IF Session["userId"] == null,Redirect至GetCookie.aspx,JS跨域请求SSOServer下的httpGetCookie.aspx 获取Cookie认证票据内容,GetCookie.aspx服务器端代码 IF 发现获取的Cookie字符串内容为空,跳转至login.aspx。IF 获取的Cookie字符串内容不为空,将Cookie票据字符串内容发送至SSOServer WEB服务GetUserIdByRecordID.asmx,验证票据成功后,Web服务返回UserID,产生Session["userId"] = userID,根据UserID在该站点数据库中取得该用户在该站点的权限列表集合。
若跳至login.aspx,根据用户输入的用户名、密码,查询该站点的用户数据库,验证通过后,产生Session["userId"] = userId,根据UserID在该站点数据库中取得该用户在该站点的权限列表集合。同时Respons.Write JS脚本至客户端,脚本发起请求SSOServer的authorizationCookie.aspx发放统一认证票据。
对于SiteNew的流程如下:
PageBase.cs会检查 IF Session["userId"] == null,Redirect至GetCookie.aspx,JS跨域请求SSOServer下的httpGetCookie.aspx 获取Cookie认证票据内容,GetCookie.aspx服务器端代码 IF 发现获取的Cookie字符串内容为空,跳转至SSOServer下login.aspx。IF 获取的Cookie字符串内容不为空,将Cookie票据字符串内容发送至SSOServer WEB服务GetUserIdByRecordID.asmx,验证票据成功后,Web服务返回UserID,产生Session["userId"] = userID,根据UserID取得该用户在该站点的权限列表集合。
若跳至SSOServer下login.aspx,根据用户输入的用户名、密码,查询SSOServer的用户数据库,验证通过后,产生Session["userId"] = userId,根据UserID取得该用户在该站点的权限列表集合。同时Respons.Write JS脚本至客户端,脚本发起请求SSOServer下的authorizationCookie.aspx发放统一认证票据。
至于详细细节实现,代码都很简单。请列位看倌,下载Demo代码后,自己翻阅查看 ... ...
问题一:如何做到B/S、C/S系统的混合型信息业务系统的单点登录、统一认证?
问题二:如何做到SSO大系统下的B/S、C/S信息业务子系统不做任何代码级修改或者架构设计上的改造而实现问题一?
请网友们各抒己见,提供参考意见和思路、提示 ... ...
如果有什么请联系我,QQ:908460320。