(转自http://my.donews.com/chenyf97/2007/06/25/j2ee%e5%92%8cdomino%e7%b3%bb%e7%bb%9f%e9%97%b4%e8%b7%
a8%e5%9f%9fsso%e7%9a%84%e5%ae%9e%e7%8e%b0%ef%bc%88%e4%b8%80%ef%bc%89/)
1. SSO需求
单点登录(Single Sign On, SSO)是企业应用集成中最常见的需求。异构系统间往往都有各自的用户管理和身份验证机制,为
避免用户在进行系统切换时频繁输入用户名和密码,因此必须要实现单点登录。
2. SSO原理
说到SSO的原理,先得说一般Web应用的身份验证原理。Web身份验证之所以能成为问题主要在于HTTP协议的无状态性,这导
致了每次HTTP的请求和响应的无关性。而应用的状态保持是大部分应用系统的一般性需求,因此必须借助其他机制,这就是Cookie。
2.1. Cookie的原理
一个Cookie由name、value、domain、path、expires组成。可以给HTTP响应添加Cookie,然后Cookie就作为HTTP响应的
Headers返回给浏览器,例如Domino的登录成功后的Cookie响应头为:
Set-Cookie: DomAuthSessId=1AD479C4D11CD10278A4C523320A6918; path=/
没有设置expires就表示仅在当前浏览器进程生命期内有效,不保存到客户机上;若expires时间大于当前时间,则浏览器在收到
这个 Cookie以后将其写入到客户机文件中,一般是保存在C:\Documents and Settings\Administrator\Cookies\下。
没有设置domain就表示只在当前域内有效。
当客户机再次请求该域内的其他资源时,浏览器会自动将该域内的Cookie附在请求的Headers一起发送给Web服务器,形如:
Cookie: DomAuthSessId=1AD479C4D11CD10278A4C523320A6918
如此Web应用就能够通过读取HTTP请求Headers里面的Cookie值来判断用户身份,这样也就间接实现了HTTP的状态保持需
求。
2.2. SSO原理
了解的Cookie的原理以后就不难理解SSO的原理了。SSO的目的是为了实现两个或多个应用系统间的单点登录,其实现手段无
非是在登录A系统的 同时自动登录到B系统、C系统……,结合Cookie也就是说在SSO登录时同时去A系统、B系统、C系统进行验证,并将来自各系统的Cookie返回给 浏览器,就是这么简单。
一般情况下,做SSO要统一登录界面,这可以通过将各应用系统的登录界面重定向到指定的登录页来实现。
2.3. Cookie的局限
如果仅仅如上所说这么简单,那也就不会创造什么SSO的概念了。问题出在Cookie的domain上。出于浏览器安全的考虑,HTTP响应 Headers中的Cookie的domain只有与HTTP请求域(a.abc.com)一致或为上级域(abc.com)时,Cookie才能生效。
也就是说:
若A、B系统域名分别为a.abc.com和b.abc.com,登录系统A,同时写来自两个系统的Cookie到浏览器,且Cookie的domain设为.abc.com,那么浏览器是可以接受的,SSO成功。
若A、B系统域名分别为a.abc.com和b.xyz.com,登录系统A,同时写来自两个系统的Cookie到浏览器,其中A Cookie的domain设为.abc.com,B Cookie的domain设为.xyz.com,那么浏览器是不可以接受B Cookie的,因为该HTTP请求是来自.abc.com,因此不能写.xyz.com域中的Cookie。
这也就是跨域SSO难题的原因所在。
2.4. 跨域SSO
了解了Cookie的局限和跨域SSO难题所在,也就不难找到解决跨域问题的办法了:由各应用系统中创建各自域的Cookie并返回给浏览器。不要幻想在一个应用中创建所有域的Cookie,这是徒劳的。
至于如何一次性在各应用系统中创建各自域的Cookie并返回给浏览器,这就仁者见仁智者见智了,一般常见的做法是:
在SSO验证成功的返回页中利用JS脚本动态创建隐藏的IFRAME,并将验证信息通过IFRAME的SRC属性的URL参数传递给各应用系统的某 个资源,这些资源可以是动态程序也可以是JS脚本,由各应用系统的动态程序或JS脚本根据传入的参数来完成该应用的验证过程并返回验证通过的 Cookie。
下文说的做法与上略有不同,我的想法是:只在请求哪个应用系统时才进行哪个应用系统的身份验证,而不是一次性全将所有身份都验证完毕。
3. Domino SSO 实现
Domino 的用户信息和身份验证是通过目录(NAMES.NSF )来实现的;J2EE 系统也往往有自己开发的用户管理和身份验证机制。要实现二者的SSO ,可以通过部署统一的身份认证应用来完成。
要部署唯一的SSO 应用有三个选择:
l 扩展Domino 的身份认证功能,提供SSO 服务;
l 扩展J2EE 系统的身份认证功能,提供SSO 服务;
l 部署单独的SSO 应用,提供SSO 服务;
Domino 的身份认证在names.nsf 中进行,登录界面在domcfg.nsf 中,通过提交包含用户名(username )和密码(password )的请求到路径/names.nsf?Login 即可完成验证过程。但Domino 验证是通过其内在机制实现的,没有给开发者提供任何显示的程序代码(如何进行用户名和口令校验的代码),因此无法对Domino 的验证过程直接进行扩展。
J2EE 系统本身的用户管理和身份认证往往都由我们自行设计的,因此可以在此基础上扩展实现单点登录,我们这里采用的即是这种方案。
此外,也可以开发单独的SSO 应用,集成Domino 和J2EE 系统登录过程,本质上与在J2EE 系统基础上扩展没有区别,这里不再赘述。
3.1. Domino Cookie
前面已经提过SSO 的原理就是Cookie ,所以有必要了解Domino 系统的Cookie 。
Domino 系统根据服务器配置的不同有两种Cookie 来进行会话状态的维持。
l 单服务器,服务器返回给浏览器的Cookie 名是:DomAuthSessId 。
l 多个服务器(SSO ),服务器返回给浏览器的Cookie 名是:LtpaToken ,这是IBM 一套轻量级第三方认证标准,自动支持Websphere 和Lotus 之间的SSO 。
3.2. Domino系统设置
1. 配置Domino 的登录页
用Notes 打开domcfg.nsf 数据库,打开”Sign In Form Mapping “配置文档,设置登录页为domcfg.nsf 里的SSOLoginForm 表单。
2. 将Domino 登录页重定向到J2EE
用Designer 打开domcfg.nsf\SSOLoginForm ,通过脚本将其重定向到SSO 登录页:
js 代码
- <script language=”javascript”>
- parent.location.href = “http:
- </script>
其中该计算文本为RedirectTo 值,记录用户原始请求的DominoURL 。
3.3. J2EE系统SSO开发
3.3.1. SSO 登录界面
在SSO登录表单中,除了必要的用户名和口令输入框之外,还应有一个属性redirectTo来记录登录后的重定向路径。当用户访问某个受限资源时,系统自动重定向到该登录界面,同时记录该受限资源的路径,当输入用户名和口令并验证成功以后,系统自动将用户重定向到该受限资源处,而不是简单的返回到缺省首页。
3.3.2. SSO 验证程序
J2EE 系统自身的验证还是才有传统的用户名和口令校验方式。当检查来自客户端的访问请求是去往Domino 系统时,将自动进行Domino 的验证并重定向到相应的Domino 页面。自动Domino 验证分为两个步骤:
1. 程序自动从服务器后台通过Http URLConnection 访问Domino 系统并登录,若验证通过则读取相应的Cookie 值;
单服务器的form-based 方式验证获取Cookie 及重定向URL 代码如下:
java 代码
- URL url = new URL(httpHost + “names.nsf?Login”);
-
- HttpURLConnection.setFollowRedirects(false);
-
- HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
-
- urlConnection.setDoOutput(true);
-
- OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
-
- wr.write(”username=” + userName + “&password=” + password);
-
- wr.flush();
-
- wr.close();
-
- urlConnection.connect();
-
- Map
-
- for (Iterator<string> it = headerFields.keySet().iterator(); it.hasNext(); ) { </string>
-
- String key = it.next();
-
- if (key != null && key.equals(”Set-Cookie”)) {
-
- String value = urlConnection.getHeaderField(key);
-
- String[] cookies = value.split(”;\\s*”);
-
- for (int i = 0; i < cookies.length; i++) {
-
- String[] cookie = cookies[i].trim().split(”=”);
-
- if (cookie[0].equals(”DomAuthSessId”)) {
-
- successful = true;
-
- loginURL = httpHost + “domcfg.nsf/SSOLoginAction?OpenAgent”;
-
- loginURL += “&cookeName=DomAuthSessId”;
-
- loginURL += “&cookeValue=” + cookie[1];
-
- break;
-
- }
-
- }
-
- }
-
- }
-
- urlConnection.disconnect();
多服务器(SSO )方式获取Cookie 及重定向URL 代码如下:
java 代码
- Session session = NotesFactory.createSession(serverName, userName, password);
-
- if (session != null && session.isValid()) {
-
- successful = true;
-
- loginURL = httpHost + “domcfg.nsf/SSOLoginAction?OpenAgent”;
-
- loginURL += “&cookeName=LtpaToken”;
-
- loginURL += “&cookeValue=” + URLEncoder.encode(session.getSessionToken(), “UTF-8″);
-
- }
2. 程序将获取的Cookie 名称、Cookie 值以及目的资源地址通过URL 参数的方式传给一个Domino 的代理(也即上述代码中的变量loginURL ),由Domino 代理写Cookie 并重定到向目的资源地址。Domino 代理SSOLoginAction 也非常简单,代码示意如下:
Domino 代码
- cookieName$ = request.GetParameter(”cookeName”)
-
- cookieValue$ = request.GetParameter(”cookeValue”)
-
- redirectTo$ = request.GetParameter(”redirectTo”)
-
- Print {Set-Cookie:} + cookieName$ + {=} + cookieValue$ + {; path=/}
-
- Print {Location: } + redirectTo$ + {}
其中request.GetParameter 是自定义类方法,用以获取URL 中的参数值。
如此,J2EE 与Domino 系统间的跨域SSO 就顺利实现J
分享到:
相关推荐
本文档详细介绍了两台domino服务器如何使用“Web服务器配置”和“使用Internet 站点文档”等两种方式建立web sso的详细步骤
### 其他系统与Domino系统的单点登录(SSO)实现 #### 一、引言 随着企业信息化建设的不断深入,多个独立的应用系统之间的数据共享和业务协同变得日益重要。为了提升用户体验,减少重复登录操作,单点登录(Single ...
标题“domino_ldap.rar...总的来说,这个解决方案旨在提高企业环境的安全性和效率,通过Java编程和AD与Domino的集成,实现用户统一的身份验证和无缝的SSO体验。理解并掌握这些知识点对于管理和维护这样的系统至关重要。
java访问domino,通过http访问Domino,java快速访问Domino,java集成lotus domino 完全提供源码 界面请查阅 https://blog.csdn.net/weijia3624/article/details/113108704
《Domino SSO配置详解》 在IT领域,Single Sign-On...理解SSO的基本原理,熟悉Domino服务器和客户端的配置,以及具备良好的问题排查能力,都是成功实现SSO的关键。希望本文能对你的Domino SSO配置之旅提供有力的指导。
Java 访问 Domino 的编程指南是指在 Java 语言中如何访问和操作 Domino 对象的编程指南。Domino 是一种商业软件,它提供了强大的信息管理和collaboration 功能。Java 是一种广泛使用的编程语言,经常用来开发各种...
- **Oracle Internet Directory (OID)**:Oracle公司的目录服务,支持SSO和身份管理。 3. **商业软件的局限性**: - 需要对集成的系统进行一定程度的改造,可能涉及安装代理(AGENT)。 - 通常只预置了对常见...
DOMINO SSO指的是在基于IBM Domino平台的应用系统中实现单点登录功能的技术。本文将详细介绍纯DOMINO SSO的配置方法及其实现过程。 #### 二、DOMINO SSO概述 DOMINO SSO是一种基于IBM Domino平台的单点登录解决方案...
Lotus Domino作为IBM的一款强大的协作平台,支持多种方式实现SSO,包括NTLM、Kerberos和基于Cookie的SSO。这里我们主要关注的是基于Cookie的SSO机制,也称为Web-Single Sign-On (W-SSO)。 1. **LTPA Tokens(Lotus ...
在IT领域,Java是一种广泛使用的编程语言,而Lotus Domino是一种流行的企业级应用平台,尤其在协同工作和信息管理方面。本压缩包“java访问domino数据库.rar”提供了关于如何利用Java来访问和操作Domino数据库的重要...
Java连接到Domino主要是为了实现程序化地访问和操作Domino数据库,例如处理邮件、联系人、任务等。这篇文档将详细介绍如何使用Java与Lotus Domino进行交互,并基于提供的压缩包文件内容展开讨论。 首先,Java连接到...
- **同一DNS域**:为了使Cookie能够在不同系统间共享,参与SSO的系统必须位于同一个DNS域下。 - **浏览器支持Cookies**:SSO机制依赖于浏览器支持Cookies功能。 #### 三、LTPA Token组成原理 LTPA Token是实现SSO...
3. **开源解决方案**:对于预算有限或者愿意自己构建SSO系统的组织,可以考虑开源项目,如 JOSSO (Java Open Single Sign-On)、OpenSSO (由 Sun Microsystems 开发,后来成为 ForgeRock 的 OpenAM) 和 SourceID。...
Java远程访问Domino邮箱数据是通过使用Lotus Domino Java API(Lotus Domino JNA或Lotus Domino Access for Java)来实现的。这个过程涉及到多个步骤和技术,包括理解Lotus Domino的架构、设置Java环境以及使用特定...
- Java API为开发者提供了通过Java应用程序操作Domino数据库的能力,使得可以在Java应用中实现对Domino数据的增删查改等功能。 3. **基本概念**: - **NotesThread**: 用于初始化和清理线程环境。 - **Sessions*...
在提供的压缩包文件中,"flash在domino中的使用"可能包含有关如何在Domino环境中使用Flash的详细指南,"java在domino中的使用"可能会讲解如何创建和部署Java Web服务,而"Webservice在domino中的使用"则可能涵盖了...
DIIOP设置是实现Java程序与Domino服务器通信的关键。在Domino控制台中,进入“服务器”>“配置”>“DIIOP”选项卡进行配置。主要需要关注以下几个方面: - **基本信息**: - Server Name:输入服务器名称。 - ...