桌面s?s?o的方案

6 桌面SSO的实现

从WEB-SSO的概念延伸开,我们可以把SSO的技术拓展到整个桌面的应用,不仅仅局限在浏览器。SSO的概念和原则都没有改变,只需要再做一点点的工作,就可以完成桌面 SSO 的应用。

桌面SSO和WEB-SSO一样,关键的技术也在于如何在用户登录过后保存登录的凭据。在WEB-SSO中,登录的凭据是靠浏览器的cookie机制来完成的;在桌面应用中,可以将登录的凭证保存到任何地方,只要所有SSO的桌面应用都共享这个凭证。

从网站可以下载一个简单的桌面SSO的样例(http://gceclub.sun.com.cn/wangyu/desktop-sso/desktopsso.zip)和全部源码(http://gceclub.sun.com.cn/wangyu/desktop-sso/desktopsso_src.zip),虽然简单,但是它具有桌面SSO大多数的功能,稍微加以扩充就可以成为自己的解决方案。

6.1桌面样例的部署

  1. 运行此桌面SSO需要三个前提条件:
    a) WEB-SSO的身份认证应用应该正在运行,因为我们在桌面SSO当中需要用到统一的认证服务
    b) 当前桌面需要运行Mozilla或Netscape浏览器,因为我们将ticket保存到mozilla的cookie文件中
    c) 必须在JDK1.4以上运行。(WEB-SSO需要JDK1.5以上)
  2. 解开desktopsso.zip文件,里面有两个目录bin和lib。
  3. bin目录下有一些脚本文件和配置文件,其中config.properties包含了三个需要配置的参数:
    a) SSOServiceURL要指向WebSSO部署的身份认证的URL
    b) SSOLoginPage要指向WebSSO部署的身份认证的登录页面URL
    c) cookiefilepath要指向当前用户的mozilla所存放cookie的文件
  4. 在bin目录下还有一个login.conf是用来配置JAAS登录模块,本样例提供了两个,读者可以任意选择其中一个(也可以都选),再重新运行程序,查看登录认证的变化
  5. 在bin下的运行脚本可能需要作相应的修改
    a) 如果是在unix下,各个jar文件需要用“:”来隔开,而不是“;”
    b) java 运行程序需要放置在当前运行的路径下,否则需要加上java的路径全名。

6.2桌面样例的运行

样例程序包含三个简单的Java控制台程序,这三个程序单独运行都需要登录。如果运行第一个命叫“GameSystem”的程序,提示需要输入用户名和密码:

效验成功以后,便会显示当前登录的用户的基本信息等等。

这时候再运行第二个桌面Java应用(mailSystem)的时候,就不需要再登录了,直接就显示出来刚才登录的用户。

第三个应用是logout,运行它之后,用户便退出系统。再访问的时候,又需要重新登录了。请读者再制裁执行完logout之后,重新验证一下前两个应用的SSO:先运行第二个应用,再运行第一个,会看到相同的效果。

我们的样例并没有在这里停步,事实上,本样例不仅能够和在几个Java应用之间SSO,还能和浏览器进行SSO,也就是将浏览器也当成是桌面的一部分。这对一些行业有着不小的吸引力。

这时候再打开Mozilla浏览器,访问以前提到的那两个WEB应用,会发现只要桌面应用如果登录过,Web应用就不用再登录了,而且能显示刚才登录的用户的信息。读者可以在几个桌面和Web应用之间进行登录和logout的试验,看看它们之间的SSO。

6.3桌面样例的源码分析

桌面SSO的样例使用了JAAS(要了解JAAS的详细的信息请参考http://java.sun.com/products/jaas)。JAAS是对PAM(Pluggable Authentication Module)的Java实现,来完成 Java应用可插拔的安全认证模块。使用JAAS作为Java应用的安全认证模块有很多好处,最主要的是不需要修改源代码就可以更换认证方式。例如原有的Java应用如果使用JAAS的认证,如果需要应用SSO,只需要修改JAAS的配置文件就行了。现在在流行的J2EE和其他 Java的产品中,用户的身份认证都是通过JAAS来完成的。在样例中,我们就展示了这个功能。请看配置文件login.conf

DesktopSSO {

desktopsso.share.PasswordLoginModule required;

desktopsso.share.DesktopSSOLoginModule required;

};

当我们注解掉第二个模块的时候,只有第一个模块起作用。在这个模块的作用下,只有test用户(密码是12345)才能登录。当我们注解掉第一个模块的时候,只有第二个模块起作用,桌面SSO才会起作用。

所有的Java桌面样例程序都是标准JAAS应用,熟悉JAAS的程序员会很快了解。JAAS中主要的是登录模块(LoginModule)。下面是SSO登录模块的源码:

public class DesktopSSOLoginModule implements LoginModule {

..........

private String SSOServiceURL = "";

private String SSOLoginPage = "";

private static String cookiefilepath = "";

.........

在config.properties的文件中,我们配置了它们的值:

SSOServiceURL=http://wangyu.prc.sun.com:8080/SSOAuth/SSOAuth

SSOLoginPage=http://wangyu.prc.sun.com:8080/SSOAuth/login.jsp

cookiefilepath=C:\\Documents and Settings\\yw137672\\Application Data\\Mozilla\\Profiles\\default\\hog6z1ji.slt\\cookies.txt

SSOServiceURL和SSOLoginPage成员变量指向了在Web-SSO中用过的身份认证模块:SSOAuth,这就说明在桌面系统中我们试图和Web应用共用一个认证服务。而cookiefilepath成员变量则泄露了一个“天机”:我们使用了Mozilla浏览器的cookie文件来保存登录的凭证。换句话说,和Mozilla共用了一个保存登录凭证的机制。之所以用Mozilla是应为它的Cookie文件格式简单,很容易编程访问和修改任意的Cookie值。(我试图解析Internet Explorer的cookie文件但没有成功。)

下面是登录模块DesktopSSOLoginModule的主体:login()方法。逻辑也是非常简单:先用Cookie来登陆,如果成功,则直接就进入系统,否则需要用户输入用户名和密码来登录系统。

public boolean login() throws LoginException{

try {

if (Cookielogin()) return true;

} catch (IOException ex) {

ex.printStackTrace();

}

if (passwordlogin()) return true;

throw new FailedLoginException();

}

下面是Cookielogin()方法的实体,它的逻辑是:先从Cookie文件中获得相应的Cookie值,通过身份效验服务效验Cookie的有效性。如果cookie有效就算登录成功;如果不成功或Cookie不存在,用cookie登录就算失败。

public boolean Cookielogin() throws LoginException,IOException {

String cookieValue="";

int cookieIndex =foundCookie();

if (cookieIndex<0)

return false;

else

cookieValue = getCookieValue(cookieIndex);

username = cookieAuth(cookieValue);

if (! username.equals("failed")) {

loginSuccess = true;

return true;

}

return false;

}

用用户名和密码登录的方法要复杂一些,通过Callback的机制和屏幕输入输出进行信息交互,完成用户登录信息的获取;获取信息以后通过userAuth方法来调用远端SSOAuth的服务来判定当前登录的有效性。

public boolean passwordlogin() throws LoginException {

//

// Since we need input from a user, we need a callback handler

if (callbackHandler == null) {

throw new LoginException("No CallbackHandler defined");

}

Callback[] callbacks = new Callback[2];

callbacks[0] = new NameCallback("Username");

callbacks[1] = new PasswordCallback("Password", false);

//

// Call the callback handler to get the username and password

try {

callbackHandler.handle(callbacks);

username = ((NameCallback)callbacks[0]).getName();

char[] temp = ((PasswordCallback)callbacks[1]).getPassword();

password = new char[temp.length];

System.arraycopy(temp, 0, password, 0, temp.length);

((PasswordCallback)callbacks[1]).clearPassword();

} catch (IOException ioe) {

throw new LoginException(ioe.toString());

} catch (UnsupportedCallbackException uce) {

throw new LoginException(uce.toString());

}

System.out.println();

String authresult ="";

try {

authresult = userAuth(username, password);

} catch (IOException ex) {

ex.printStackTrace();

}

if (! authresult.equals("failed")) {

loginSuccess= true;

clearPassword();

try {

updateCookie(authresult);

} catch (IOException ex) {

ex.printStackTrace();

}

return true;

}

loginSuccess = false;

username = null;

clearPassword();

System.out.println( "Login: PasswordLoginModule FAIL" );

throw new FailedLoginException();

}

CookieAuth和userAuth方法都是利用apahce的httpclient工具包和远程的SSOAuth进行http连接,获取服务。

private String cookieAuth(String cookievalue) throws IOException{

String result = "failed";

HttpClient httpclient = new HttpClient();

GetMethod httpget = new GetMethod(SSOServiceURL+Action1+cookievalue);

try {

httpclient.executeMethod(httpget);

result = httpget.getResponseBodyAsString();

} finally {

httpget.releaseConnection();

}

return result;

}

private String userAuth(String username, char[] password) throws IOException{

String result = "failed";

String passwd= new String(password);

HttpClient httpclient = new HttpClient();

GetMethod httpget = new GetMethod(SSOServiceURL+Action2+username+"&password="+passwd);

passwd = null;

try {

httpclient.executeMethod(httpget);

result = httpget.getResponseBodyAsString();

} finally {

httpget.releaseConnection();

}

return result;

}

还有一个地方需要补充说明的是,在本样例中,用户名和密码的输入都会在屏幕上显示明文。如果希望用掩码形式来显示密码,以提高安全性,请参考:http://java.sun.com/developer/technicalArticles/Security/pwordmask/

时间: 2024-10-06 04:36:54

桌面s?s?o的方案的相关文章

虚拟桌面安全策略:网络隔离方案

在传统的桌面方案中网络隔离方面大多使用物理隔离(如隔离卡方案.双PC模式)以及逻辑隔离(如基于ACL/VLAN的网络策略)来实现网络的隔离. 此外也可以借此如网络准入操作简称NAC的方式来实现网络的逻辑隔离NAC的方式支持多种模式 基于802.1x(与网络交换机联动当发现用户终端不符合安全策略时将用户终端隔离到特定VLAN). 基于网关模式的NAC(如VPN模式当NAC设备放在用户需要访问的服务器的前端如公司内网门户用户访问后端服务时客户的流量因为需要经过NAC设备所以可以强制用户的设备做安全检

桌面系统集成WEB认证系统方案

最近做的一个项目,有WEB版.WPF版.手机版.领导想集成集团的一个现成的认证系统,姑且称这个认证系统名为 W4认证系统. W4认证系统有如下特点: 1.现成的 2.是个单点登录系统 3.不支持oAuth2 4.是个WEB版的认证系统,严重依赖于cookie WEB版还好,没有什么大的问题,但WPF版这些桌面程序呢,如何与WEB版的认证系统集成? 如果看百度.微信等的oAuth2接口,发现其中有个参数,名曰display,支持多种访问WEB.桌面等多种方式.因为没有研究过,网上也没有找到什么介绍

企业外发文件管控方案总结

很多企业为了数据的安全,需要对外发文件进行管控.而手机.usb存储的广泛使用,使得外发文件的管控非常难以实现.在本文中,我将抛砖引玉,探讨外发文件管控的几种方式.外发文件的管控,需要考虑如下几个方面: 屏蔽通过网络外发文件 屏蔽蓝牙.usb等外设外发文件 文件加密 1. 屏蔽通过网络外发文件 人员可以通过邮件.QQ.微信.网盘.FTP等方式来外发文件,所以,要屏蔽通过网络外发文件,可以考虑如下几个方案: a). 网站白名单,只允许访问工作需要的网站,其他一律禁止掉.这是最严格的限制方式. b).

2015-2016前端知识体系

一.框架与组件 ?bootstrap等UI框架设计与实现 伸缩布局:grid网格布局 基础UI样式:元素reset.按钮.图片.菜单.表单 组件UI样式:按钮组.字体图标.下拉菜单.输入框组.导航组.面包屑.分页.标签.轮播.弹出框.列表.多媒体.警告 响应式布局:布局.结构.样式.媒体.javascript响应式 第三方插件:插件管理 ?jQuery.zepto使用原理以及插件开发 支持amd.cmd.全局变量的模块化封装 $.fn.method = function(){} ?mvc/mvv

nginx正向代理实现受限网站的访问

项目背景:公司商务同事需要操作合作方的后台,但是这个后台做了限制(安全考虑只对指定IP放行),刚好公司是adsl拨号,经常更换IP 需求:让商务同事不要经常给IP到合作方去添加白名单 于是想到了做正向代理代理的方法,关于正向代理和反向代理的区别后面有说明,该场景适合用正向代理 具体操作:两种方案:方案1将一台固定外网ip的windows系统添加到客户网站白名单,开通一个远程账号给商务同事,让他通过远程桌面操作合作方的后台 方案2:将我们的一台linux服务器做成代理服务器IP添加到合作方的白名单

使用spec文件语法创建一个rpm

How to create an RPM package/zh-hk < How to create an RPM package 此页面包含 Packaging:ScriptletSnippets 的 zh_CN 翻译,由于不具有 ScriptletSnippets 的编辑权限,故在此保存翻译. Contents [hide] 1 RPM 打包脚本综述 2 默认 Shell 3 语法 4 脚本片段命令 5 编写脚本片段 5.1 在脚本片段间保存状态 5.2 Macros 5.3 Trigger

2015-2016前端知识体系(转)

一.框架与组件 bootstrap等UI框架设计与实现 伸缩布局:grid网格布局 基础UI样式:元素reset.按钮.图片.菜单.表单 组件UI样式:按钮组.字体图标.下拉菜单.输入框组.导航组.面包屑.分页.标签.轮播.弹出框.列表.多媒体.警告 响应式布局:布局.结构.样式.媒体.javascript响应式 第三方插件:插件管理 jQuery.zepto使用原理以及插件开发 支持amd.cmd.全局变量的模块化封装 $.fn.method = function(){} mvc/mvvm框架

【五个非常重要的移动Web内容适应设计理念】

英文原文:Mobile web content adaptation techniques 译者:赵建光 如果你要构建移动网站,那么本文可以帮你选择合适的技术方案.本文并没有具体描述如何去开发,只是介绍应该如何选择正确的方法.在开始之前我们有必要明确一下这次实践的目标.一般来说,想要构建网站的人可分为两大类: 改造现有的网站,使其可以通过移动设备访问: 从头开始构建全新的移动网站. 这两种目标是截然不同的,所以相应的技术方法也不同.前者的目标可以归结为:构建一个无缝缩放的网站.这样的网站可以在不

阿里前端大牛分享的技能整理

前端工程师技能整理 一.框架与组件 ? bootstrap等UI框架设计与实现 [ ] 伸缩布局:grid网格布局 [ ] 基础UI样式:元素reset.按钮.图片.菜单.表单 [ ] 组件UI样式:按钮组.字体图标.下拉菜单.输入框组.导航组.面包屑.分页.标签.轮播.弹出框.列表.多媒体.警告 [ ] 响应式布局:布局.结构.样式.媒体.javascript响应式 [ ] 第三方插件:插件管理 jQuery.zepto使用原理以及插件开发 [ ] 支持amd.cmd.全局变量的模块化封装 [