SSO集成规范.doc

上传人:laozhun 文档编号:2397131 上传时间:2023-02-17 格式:DOC 页数:16 大小:1.20MB
返回 下载 相关 举报
SSO集成规范.doc_第1页
第1页 / 共16页
SSO集成规范.doc_第2页
第2页 / 共16页
SSO集成规范.doc_第3页
第3页 / 共16页
SSO集成规范.doc_第4页
第4页 / 共16页
SSO集成规范.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《SSO集成规范.doc》由会员分享,可在线阅读,更多相关《SSO集成规范.doc(16页珍藏版)》请在三一办公上搜索。

1、SSO集成规范文件状态: 草稿 评审 发布文件标识:当前版本:V2.0作 者:完成日期:2011-3-10目录0文档介绍40.1目的40.2文档范围40.3适用对象40.4术语与缩写解释41应用系统SSO集成规范41.1单点登录总体规范41.1.1显式登录51.1.2隐式登录51.2应用系统SSO集成时序图61.2.1认证过程61.2.2单点退出过程71.3接入要求81.3.1总体要求81.3.2特殊情况下的接入要求92应用范例92.1Java应用作为CAS Client接入例程92.1.1实现步骤92.1.2JAVA的应用SSO集成其它情况132.2.NET应用作为CAS Client接入例

2、程132.2.1实现步骤142.2.2首页面登录改造152.2.3相关源码152.3PHP应用作为CAS Client接入例程152.3.1实现步骤152.3.2应用的首页改造162.3.3关键代码172.4其它应用的SSO集成参考17 0.1 目的1、 集团公司员工用户访问应用系统,实现一次登录,便可实现单点登录。2、 方便集成商快速且规范的完成SSO集成要求。0.2 文档范围0.3 适用对象0.4 术语与缩写解释缩写、术语解 释SSOSingle Sign On 单点登录CAS Server单点登录服务器CAS Client与单点登录服务器进行SSO集成和各应用系统ADActive Dir

3、ectory活动目录(LDAP应用软件一种),用作统一认证。1 应用系统SSO集成规范1.1 单点登录总体规范各异构平台的接入应用统一称为应用系统,应用系统只有到SSO服务平台进行登录认证后,才能进行单点登录。由SSO服务平台提供的登录界面,称为:统一认证登录界面(下同)用户首次访问应用系统时,都需要产生一个登录过程,根据当前用户IE中会话情况,分为两种登录过程:1)显示登录 2)隐式登录。1.1.1 显式登录显式登录:需要出现SSO服务器提供的登录界面,用户在此界面,输入登录信息并通过SSO服务器端的AD认证后才能访问应用系统;显示登录过程如图:1.1.2 隐式登录隐式登录:完全由应用系统后

4、台自动与SSO服务平台交互完成,用户访问操作时感觉不到此过程,可直接访问应用系统的资源。出现此登录情形,仅当用户IE中的会话,是已经通过访问其它应用系统进行过显示登录后创建的,并且是有效保存的。隐式登录过程如图:在当前会话的生命周期内,显示登录只会发生一次,隐式登录根据用户在会话周期内访问多应用系统时,都且仅发生一次;1.2 应用系统SSO集成时序图1.2.1 认证过程讨论第一次访问应用系统资源时,用户、应用系统以及SSO服务平台三者之间的建立SSO服务的交互过程。1. 显式登录的认证时序图显式登录判断条件:用户当前IE中会话,即没有到SSO服务平台做过登录,也没有登录当前应用系统。可根据当前

5、会话中:session(以及cookie)和ticket是否同时为空进行判断,符合条件则进行显式登录认证过程。2. 隐式登录的认证时序图隐式登录的判断条件:用户当前的IE会话,虽然已通过登录过SSO服务器并认证通过,但属第一次访问当前应用系统。可根据当前会话中:获取到了ticket,但session(以及cookie)为空进行判断,符合条件则进行隐式登录的认证过程。3. 认证过程实现伪码if (当前session有效) 继续响应请求;else if (session中无ticket) /进行显式登录认证过程 重定向到统一认证登录界面; else String user=根据会话中的ticket

6、验证并解析用户ID if (user = null) 重定向到统一认证登录界面; return;/进行隐式或显式登录应用系统登录过程 if (session!=null) 记录已登录的本地session; 完成第三方应用登录接口调用; 继续响应请求 1.2.2 单点退出过程1. 时序图2. 实现方法及步骤1) 调用CAS Server单点退出接口http(s):/ /logout;2) 清除本地Session,以及cookie;3) 重定向到统一认证登录界面;1.3 接入要求1.3.1 总体要求1. 需求提供两方面程序介质及相关文档:1)过滤器程序:应与应用系统松耦合关系,可扩展,也可替换、停

7、用;2)应用系统权限加载接口程序等,通过此接口调用,可完成应用系统的登录;2. 过滤器程序:需要开源,且程序代码注示不少于代码量的30%,符合本文第4章节制定的处理逻辑,和逻辑方法的划分;需要让项目负责人撑握实现机制。3. 与CAS server集成时,即要支持HTTP方式的接口,也要支持HTTPS方式的接口,但不能混合使用。提供相关的资源配置,统一放在一个XML文件中方便管理。4. 实现SSO集成后,需保证完成登录成功后建立的会话周期内,即使CAS服务停止,应用仍然可正常使用。5. 相关的类命名需要以CJSC开头。相关的程序包需求放在com.cjsc.下的功能包中;6. 应用系统不记录用户的

8、登录密码信息。7. 开发商现场开发或测试时,必需在CAS Server测试环境进行。通过相关验证后,由相关工程师指导下进行实盘测试。1.3.2 特殊情况下的接入要求CAS服务器异常情况,或管理需要时,应用系统允许切入到应用系统以统一认证方式进行登录使用系统(统一认证方式,见附件统一认证接口规范.doc)。2 应用范例2.1 Java应用作为CAS Client接入例程下面例子,通过介绍通过过滤器技术,拦截对java应用web页面的请求,实现JAVA的WEB应用系统,如何实现内部模块间的SSO,并与统一认证平台实现单点登录,并达到SSO集成要求的实现过程。2.1.1 实现步骤1. 实现过滤器过滤

9、器需实现继承javax.servlet.Filter接口代码如下:1) 过滤器类(引用到casclient.jar;servlet.jar)package com.cjsc.sso;import java.io.IOException;import .URLEncoder;import java.util.StringTokenizer;import javax.servlet.*;import javax.servlet.http.*;import javax.xml.parsers.ParserConfigurationException;import org.xml.sax.SAXExc

10、eption;import edu.yale.its.tp.cas.client.ProxyTicketValidator;import edu.yale.its.tp.cas.client.Util;/* * 作者: 张阿强 * 版本: V1.0.0, 2011-1-19 * 描述: 实现javax.servlet.Filter接口 */public class CJSCFilter implements Filter /* 用户设置或取出SESSION名称,此值,在不同应用中统一“com.cjsc.sso.username” */public final static String CAS

11、_FILTER_USER = com.cjsc.sso.username;/ 常用接口private String casLogin, casValidate, casServerName;/ 暂时未启用接口private String casAuthorizedProxy, casServiceUrl, casRenew;private boolean wrapRequest;/* * 根据WEB.xml配置,初始化CAS SEERVER接口信息 */public void init(FilterConfig config) throws ServletException / 重定向到登录界

12、面的接口casLogin = config.getInitParameter(com.cjsc.sso.loginUrl);/ 进行ticket有效性验证接口,返回XML文件,可解析请求者的身份信息casValidate = config.getInitParameter(com.cjsc.sso.validateUrl);/ 客户端应用的“服务名称”,默认端口为80,可以在XML文件中指定casServerName = config.getInitParameter(com.cjsc.sso.serverName);/* * 过滤器的处理过程 */public void doFilter(S

13、ervletRequest request, ServletResponse response,FilterChain fc) throws ServletException, IOException / 判断当前是 HTTP请求if (!(request instanceof HttpServletRequest)| !(response instanceof HttpServletResponse)throw new ServletException(统一认证登录只支持HTTP资源请求);/ 判断当前是否需要 Wrap请求;if (wrapRequest) request = new CJ

14、SCFilterRequestWrapper(HttpServletRequest) request);HttpSession session = (HttpServletRequest) request).getSession();/ 判断是否已建立有效会话,如果已建立,过滤器不做处理。if (session != null & session.getAttribute(CAS_FILTER_USER) != null) / 响应请求fc.doFilter(request, response);return;String ticket = request.getParameter(ticke

15、t);/ 当前没有建立有效会话时,如果请求中不包含:ticket,重定向到统一登录界面if (ticket = null | ticket.equals() if (casLogin = null) throw new ServletException(应用系统的web.xml中缺少统一认证登录界面的接口参数: com.cjsc.sso.loginUrl。);/ 重定向到统一登录界面(HttpServletResponse) response).sendRedirect(casLogin+ ?service= + getService(HttpServletRequest) request);

16、return;/ 请求中含有ticket,判断ticket是否有效,并返回请求者的身份信息。String user = getAuthenticatedUser(HttpServletRequest) request);if (user = null) / 重定向到统一登录界面(HttpServletResponse) response).sendRedirect(casLogin+ ?service= + getService(HttpServletRequest) request); return;if (session != null) session.setAttribute(CAS_

17、FILTER_USER, user);System.out.println(完成首次登录,将用户ID: + user + 存入当前会话session中。);login3rdApp(user);/ 继续响应请求fc.doFilter(request, response);public void destroy() public void login3rdApp(String userName) /TODO 此处可扩展完成与第三方JAVA应用登录集成,调用登录接口/* * 描述: 根据ticket解析出请求者的“用户ID” */private String getAuthenticatedUser

18、(HttpServletRequest request)throws ServletException ProxyTicketValidator pv = null;try pv = new ProxyTicketValidator();pv.setCasValidateUrl(casValidate);pv.setServiceTicket(request.getParameter(ticket);pv.setService(getService(request);pv.setRenew(Boolean.valueOf(casRenew).booleanValue();pv.validate

19、();if (!pv.isAuthenticationSuccesful()throw new ServletException(认证失败: + pv.getErrorCode() + : + pv.getErrorMessage();if (pv.getProxyList().size() != 0) if (casAuthorizedProxy = null) throw new ServletException(页面请求不支持代理方式的 tickets。); else boolean authorized = false;String proxy = (String) pv.getPro

20、xyList().get(0);StringTokenizer casProxies = new StringTokenizer(casAuthorizedProxy);while (casProxies.hasMoreTokens() if (proxy.equals(casProxies.nextToken() authorized = true;break;if (!authorized) throw new ServletException(未通过代理认证: + pv.getProxyList().get(0) + 。);return pv.getUser(); catch (SAXE

21、xception ex) String xmlResponse = ;if (pv != null)xmlResponse = pv.getResponse();throw new ServletException(ex + + xmlResponse); catch (ParserConfigurationException ex) throw new ServletException(ex); catch (IOException ex) throw new ServletException(ex);/* * 描述:获取用户当前访问的资源URL */private String getSe

22、rvice(HttpServletRequest request)throws ServletException / 需求确保web.xml文件中已if (casServerName = null & casServiceUrl = null) throw new ServletException(web.xml中缺少配置参数: com.cjsc.sso.serviceUrl 或 + com.cjsc.sso.serverName。);if (casServiceUrl != null) return URLEncoder.encode(casServiceUrl); else return

23、Util.getService(request, casServerName);2) 实现RequestWrapper解析类package com.cjsc.sso;import com.cjsc.sso.CJSCFilter;import javax.servlet.http.*;/* * 作者: 张阿强 * 版本: V1.0.0, 2011-1-19 * 描述: */public class CJSCFilterRequestWrapper extends HttpServletRequestWrapper public CJSCFilterRequestWrapper(HttpServl

24、etRequest request) super(request);public String getRemoteUser() return (String) getSession().getAttribute(CJSCFilter.CAS_FILTER_USER);2. 资源包部署1) 将casclient.jar包,放于应用WAR包中的WEB-INF/lib目录下。2) 将过滤器类编译好,放于WAR包中的WEB-INF/classes目录下3. 配置过滤器可通过修改WAR包中的WEB-INF目录下的部署文件web.xml,增加过滤器配置,如下:CJSCFiltercom.cjsc.sso.

25、CJSCFilter com.cjsc.sso.loginUrl com.cjsc.sso.validateUrl com.cjsc.sso.serverName :443 CJSCFilter /servlet/*4. 重启WEB服务器生效2.1.2 JAVA的应用SSO集成其它情况如果应用系统已实现内部模块间的SSO,那需求实现与统一认证平台SSO集成,方法步骤同上1-5,需要实现CJSCFilter类的login3rdApp()方法。在登录成功后,CJSCFilter 做好了处理,可方法开发员直接从 Session 的属性中获取用户名,3种获取用户ID的方法说明如下:1. 在 Java

26、中通过 Session 获取登录用户ID2. 通过 JSTL 获取登录用户ID3. 通过 CJSCFilterRequestWrapper获取登录用户IDCJSCFilterRequestWrapper reqWrapper =new CJSCFilterRequestWrapper (request);out.println(登录用户名: + reqWrapper.getRemoteUser();2.2 .NET应用作为CAS Client接入例程下面例子,通过介绍通过过滤器技术,拦截对.NET应用web页面的请求,实现.NET的WEB应用系统,对原有的内部模块间的SSO基础上实现改造,与统

27、一认证平台实现单点登录,并达到SSO集成要求的实现过程:2.2.1 实现步骤1. 实现过滤器单独建立一个类库,写一个类,实现System.Web.IhttpModule接口,类的伪码描述如下: if(本地session或其他登录标示有效)/不做任何处理,直接访问应用系统return;else/本地session无效,判断有没有SSO统一认证中心ticket string tkt = app.Context.Request.QueryStringticket;if(ticket无效)/SSO统一认证中心令牌无效,直接重定向到统一认证中心登录+应用系统地址app.Context.Response.

28、Redirect( 用户访问的地址); return;else/解析SSO统一认证ticket,提取用户信息/并根据用户信息在本应用生成对应session或其他应用登录标示。 StreamReader Reader = new StreamReader(new WebClient().OpenRead( + tkt + &service= +用户访问的地址); string resp = Reader.ReadToEnd(); NameTable nt = new NameTable(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(

29、nt); XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); XmlTextReader reader = new XmlTextReader(resp, XmlNodeType.Element, context);string netid = null; /读取SSO凭证ticket,获取ticket对应的用户ID while (reader.Read() if (reader.IsStartElement() string tag = reader.LocalName; if

30、(tag = user) netid = reader.ReadString(); reader.Close(); /判断凭证用户ID是否获取if (netid = null) /重定向到统一认证登录界面app.Context.Response.Redirect( + tkt + &service= +用户访问的地址); return; /凭证有效获取用户ID信息,根据用户ID读取数据库资源,创建sessionapp.Context.SessionUserName = netid;user = netid;2. 生成一个dll文件,放入.NET应用服务的bin目录下3. web.config配

31、置文件增加配置项 4. 重启.NET应用IIS服务器2.2.2 首页面登录改造一般应用系统内部各模块间,已经实现了自己的SSO,需求实现与统一认证平台实现SSO集成,具体步骤同上,只需在原有登录基础上需要做相应修改(一般改造和重写原有登录页面脚本的page_load方法),伪码描述如下:If(本地session或其他登录标示有效)/直接定位到页面首页else /本地session或其他登录标示无效 获取SSO统一认证中心ticket If(ticket无效)/重定向到统一认证中心else/解析ticket获取用户信息并生成本地session或其他登录标示 2.2.3 相关源码HR系统实现SSO

32、集成的具体过滤器代码和首页改造代码参见附件:2.3 PHP应用作为CAS Client接入例程2.3.1 实现步骤设备PHP应用地址为http:/192.168.1.1/1. 给PHP应用安装PHPCAS客端程序1) 解压PHPCAS-1.2.2.rar2) 将CAS 目录、CAS.php和test.php 拷入PHP的应用默认安装目录中。2. 确保PHP服务器能访问CASServer登录PHP服务器设备,打开IE,输入出现登录界面说明OK;3. 启用PHP服务器curl服务找到PHP服务器配置文件php.ini,找到curl_init()方法,将;extension=php_curl.dll

33、前的“;”去掉;并重启PHP服务。如果第4步测试不成功。尝试如下步骤:将libeay32.dllssleay32.dll(在PHP服务器目录下)拷贝到system32目录下,再测试;4. 测试PHP的CAS是否配置成功输入http:/192.168.1.1/test.php ,如果出现登录界面,输入正确用户及口令登录成功后,会将用户信息在页面中显示说明配置成功2.3.2 应用的首页改造完成2.3.1的配置步骤后,找到PHP登录页面,如(login.php),进行改造,相关伪码如下:If(本地session或其他登录标示有效)/直接定位到页面首页else /本地session或其他登录标示无效

34、获取SSO统一认证中心ticket If(ticket无效)/重定向到统一认证中心else/解析ticket获取用户信息并生成本地session或其他登录标示为保证系统内置账号(如admin)依然能登录系统;建议改造login.php页面前先备份一个(如:命名为loginnosso.php),那么SSO集成后,adm2.3.3 单点退出页面改造!-$.ajax(type:POST,url:data:,success:function(msg)/alert(DataSaved:+msg);if(msg.indexOf(注销成功) window.location.href=/login.php;

35、/alert() ); /-2.3.4 关键代码在login.php登录页面引入并完成如下代码include_once(CAS.php);/读取PHPCAS基础库phpCAS:client(2.0, , 443, /cas);/初始化PHPCASphpCAS:setNoCasServerValidation();phpCAS:forceAuthentication();/重定向到login进行登录或验证票据if (isset($_REQUESTlogout) phpCAS:logout();/解析ticket,是否成功获取用户登录IDif( phpCAS:getUser()成功) ./完成应用登录过程2.4 其它应用的SSO集成参考源码包cas-client-2.0.11.zip ,源码包提供:ASP、contrib、java、perl、plsql、plthon等语言应用与CAS Server实现SSO集成的程序样例(应用系统与CAS Server集成可参照提供的各语言样例程序实现,其它访问如:Ruby、uPortal、PHP、.NET等语言可到官方网站查找相关例程。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号