Technical Blog Post
Abstract
IBM Java Toolbox for i 实现三种基于IBM i 的身份验证策略
Body
对于从事IBM i平台的应用开发者而言,用户身份验证是保证程序安全性的最基本功能之一。作为访问与操纵IBM i平台上数据与资源的Java API,IBM Java Toolbox for i从编程的角度,实现了各种用户身份验证策略,可简单、高效地解决程序的安全性问题。本文将从Web应用的角度,结合具体样例,指导IBM i Web应用程序开发者如何使用IBM Java Toolbox for i实现不同的身份验证策略。有关IBM Java Toolbox for i的基础知识,请参见另一篇技术文档“Toolbox for Java 和 JTOpen”。
从结构上,本文主要分为四部分。第一部分简单介绍如何使用IBM Java Toolbox for i实现基于密码的身份验证策略,它的特点是简单方便,适用于大部分应用程序。第二部分重点介绍如何使用IBM Java Toolbox for i实现基于Profile Token的第三方验证策略,它适用于对安全性比较敏感的多层(Multi-Tier)应用程序,方便Profile Token在不同层之间传递,而不用暴露密码。第三部分仅简单提及另一种基于第三方的身份验证策略——Kerberos以及IBM Java Toolbox for i对Kerberos验证的支持,非本文重点,不做展开。Kerberos验证的特点是单点登录SSO(Single Sign On),即用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务。最后一部分是总结。
开发样例Web应用程序
为简单起见,本文样例Web应用程序的业务逻辑相对比较简单,即实现登录功能。开发者可以借助Eclipse等IDE工具完成Web应用程序的开发工作,然后将其部署到IBM i对应的HTTP服务器以及应用服务器。这里,我们建议开发者使用IBM Web Administration for i以Web控制台的方式,完成从HTTP服务器与应用服务器的创建与管理,到Web应用程序的部署,管理与优化。有关IBM Web Administration for i的产品功能,请参见另一篇技术文档“IBM i 中间件管理:IBM Web Administration for i化繁为简”。
待样例Web应用程序完成之后,我们来梳理一下Web应用程序与IBM Java Toolbox for i的依赖关系,如图1所示:
广义上来说,IBM Java Toolbox for i提供以下三种用户身份验证策略:
- 基于密码的身份验证策略
- 基于Profile Token认证的第三方身份验证策略
- 基于Kerberos认证的第三方身份验证策略
接下来,我们具体介绍IBM Java Toolbox for i如何为样例Web应用程序提供上述3种身份验证服务。
基于密码的身份验证策略
基于密码的验证策略非常普遍,原理也相对简单。客户端将用户名与密码发送给服务器端验证,如果验证正确则建立连接,否则连接失败。为防止密码在传送过程中被窃取,一般来讲,可以采用一定的密码加密算法。
结合样例Web应用程序,实现的功能为登录。这里,我们采用基于密码的验证策略。具体说来,对应的业务逻辑是:对于客户端,用户输入用户名与密码,并点击提交;对于服务器端,在取得用户名与密码后,传递给IBM Java Toolbox for i,采取基于密码的身份验证策略。
那么,从代码的角度,该如何使用IBM Java Toolbox for i实现基于密码的身份验证策略呢?
从面向对象的角度,IBM Java Toolbox for i提供了AS400类(位于com.ibm.as400.access包),表示与服务器的连接。清单一表示的是利用AS400对象,建立与IBM i Sign On服务器的连接。在本例中,IBM Java Toolbox for i采取的是基于密码的身份验证策略。
清单 1. 基于密码的验证策略
//构造AS400,传入来自客户端的用户名与密码
AS400 sys = new AS400(system, usr, pwd);
//连接SignOn服务器,验证用户名与密码.
sys.connectService(AS400. SIGNON);
对于对安全敏感度不高的Web应用,以上这种基于密码的身份策略被广泛使用。为避免密码在网络上的明文传输,我们可以采取SSL技术对HTTP服务器加密。Web浏览器以数字证书的方式来实现客户端与HTTP服务器的相互身份确认过程。此后,HTTP服务器就可以使用SSL端口来侦听来自客户端的请求,保证客户端与HTTP服务器数据加密。
但是,基于密码的身份验证策略一个缺陷是,IBM Java Toolbox for i所要求的用户名与密码必须为明文。付出的安全代价是,HTTP服务器就必须向Web应用程序暴露来自客户端的用户名与密码,提供给IBM Java Toolbox for i。作为Web应用程序的开发者,可以轻松截取用户名与密码,另作它用,例如后门程序,这是一种潜在的不安全行为。
一种更加安全的做法是采用Profile Token的方式,即采取基于第三方身份验证策略。这样,HTTP服务器就可以将客户端的用户名与密码封装成一个字节数组,即所谓的Profile Token,打包传给Web应用程序,最终转发给IBM Java Toolbox for i做第三方身份验证。接下来,我们将介绍样例Web应用程序如何借助HTTP服务器以及IBM Java Toolbox for i,实现基于Profile Token的第三方身份验证策略。
基于Profile Token认证的第三方身份验证策略
前面,我们利用IBM Java Toolbox for i实现了基于密码的身份验证。换句话说,HTTP服务器在接收到来自客户端的请求后,将用户名与密码以明文的方式转发给应用服务器以及IBM Java Toolbox for i。这里,由于我们采取的是基于第三方身份的Profile Token认证机制,这就要求HTTP服务器传给IBM Java Toolbox for i的不是用户名与密码,而是用字节数组表示的Profile Token。那么该如何配置HTTP服务器呢?
HTTP服务器生成Profile Token
在HTTP服务器中,提供Profile Token支持的为ProfileToken指令,如清单二所示:
清单 2. HTTP服务器配置ProfileToken指令
<Location />
…
ProfileToken on
…
</Location>
从代码中可以看出,以上与安全相关指令组作用域为后缀是/的URL,换句话说。HTTP服务器配置的安全策略作用于整个样例Web应用程序。
其中,我们重点关注ProfileToken on指令。它表示的是基于Profile Token的第三方身份验证策略。具体而言,HTTP服务器将该用户名与密码封装生成Profile Token,并以AS_Auth_ProfileTkn变量的方式存储在HTTP Header中,传送给样例Web应用程序。
从浏览器的角度,弹出验证窗口要求输入用户名与密码,并提交给HTTP服务器。在收到HTTP请求之后,HTTP服务器根据ProfileToken指令生成Profile Token字符串,如图2所示:
图 2. 浏览器弹出验证窗口与HTTP服务器生成的Profile Token IBM Java Toolbox for i获取Profile Token
这样,在接收到来子HTTP服务器的Profike Token之后,样例Web应用程序就可以利用IBM Java Toolbox for i从HTTP Header中获取相应用户的Profile Token的业务逻辑如清单三所示:
清单 3. 获取HTTP服务器生成的Profile Token
String authHeader = request.getHeader("AS_Auth_ProfileTkn");
response.sendError(403);
return;
}
清单 4. 基于Profile Token的验证策略
//根据指定Profile Token生成AS400对象
profileToken = new ProfileTokenCredential();
profileToken.setToken(authHeaderBytes);
sys = new AS400(system, profileToken);
sys.connectService(AS400. SIGNON);
通过对比基于密码与基于Profile Token的策略,我们发现,从编程的角度,我们最终的目标是构造AS400对象,实现与IBM i服务器的连接。所不同的是,基于Profile Token的策略不需要将密码暴露给上层Web应用,并且由HTTP服务器生成的Profile Token实现与IBM Java Toolbox for i实现无缝对接,既提高了Web应用程序的安全性,又简化了编程,而这正是IBM Java Toolbox for i的优势所在。
基于Kerberos认证的第三方身份验证策略
清单5. 基于Kerberos认证的验证策略
//利用Java GSS框架获取凭据Ticket
GSSManager manager = GSSManager.getInstance();
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
GSSName userName = manager.createName(usr, GSSName.NT_USER_NAME);
//获取用户对应的Ticket
userCreds = manager.createCredential(userName, GSSCredential.DEFAULT_LIFETIME,
krb5Mechanism, GSSCredential.INITIATE_ONLY);
//根据Ticket生成AS400对象
AS400 sys = new AS400();
sys.setGSSCredential(userCreds);
//连接SignOn服务器,验证用户名与密码.
sys.connectService(AS400. SIGNON);
与前面两者一样,我们最终也构造AS400对象,实现与IBM i服务器的连接。所不同的是,这里既不需要明文的用户名与密码,也不需要HTTP转发的封装有用户名与密码的Profile Token。而仅仅需要的是用户名。这种基于SSO单点登录技术的Kerberos认证机制,依赖于基于LDAP技术的EIM(Enterprise Identity Mapping)服务器的支持。有关EIM更多信息,请参考IBM i信息中心。
总结
本文主要从基于IBM i的Web应用程序身份验证的角度出发,重点介绍IBM Java Toolbox for i提供的基于Profile Token的第三方身份验证策略。作为最为简单与普遍的基于密码的身份验证策略,本文也重点提及。作为补充,本文也简要提及了基于Kerberos的第三方身份验证策略。无论是以上三种验证策略的哪一种,IBM Java Toolbox for i均提供了强大而灵活的编程接口支持。
- 参看文章“Toolbox for Java 和 JTOpen” ,了解IBM Java Toolbox for i的概要信息。
- 参考文章“IBM i 中间件管理:IBM Web Administration for i化繁为简”,了解IBM Web Administration for i的概要信息。
- 参考Java Authentication Authorization Service (JAAS) ,了解JAAS框架。
- 参考Java General Security Services (Java GSS) ,了解Java GSS框架。
- 参考“IBM i信息中心Kerberos章节”,了解更多有关Kerberos的内容。
- 参考“IBM i信息中心EIM章节”,了解更多有关EIM的内容。
UID
ibm11145056