IBM Support

IBM Java Toolbox for i 实现三种基于IBM i 的身份验证策略

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应用程序的业务逻辑相对比较简单,即实现登录功能。开发者可以借助EclipseIDE工具完成Web应用程序的开发工作,然后将其部署到IBM i对应的HTTP服务器以及应用服务器。这里,我们建议开发者使用IBM Web Administration for iWeb控制台的方式,完成从HTTP服务器与应用服务器的创建与管理,到Web应用程序的部署,管理与优化。有关IBM Web Administration for i的产品功能,请参见另一篇技术文档“IBM i 中间件管理:IBM Web Administration for i化繁为简”

 待样例Web应用程序完成之后,我们来梳理一下Web应用程序与IBM Java Toolbox for i的依赖关系,如图1所示:

图 1. Web Application的体系结构图 
图像
从图1可以看出,作为第三方Java类库,IBM Java Toolbox for i作为中间层,为上层Web应用提供各种访问底层IBM i数据与资源的服务。这其中就包括用户身份验证服务,而这也正是本文关注的重点。

广义上来说,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");

if (authHeader == null) {
   response.sendError(403);
   return;
}
byte[] authHeaderBytes = Base64.decode(authHeader);
具体说来,通过request.getHeader()方法,样例Web应用程序可以获取相应用户的Profile Token,以字节数组authHeaderBytes表示。由于程序最终的目的是要利用Profile Token构造AS400对象,连接IBM i服务器。因此,这里的authHeaderBytes只能算是中间结果。接下来,样例Web应用程序将代表Profile Token的字节数组authHeaderBytes交给IBM Java Toolbox for i,以面向对象的编程方式封装,构造AS400对象,表示与IBM i服务器的连接,如清单四所示。
清单 4. 基于Profile Token的验证策略
//根据指定Profile Token生成AS400对象
profileToken = new ProfileTokenCredential();
profileToken.setToken(authHeaderBytes);
sys = new AS400(system, profileToken);
//连接SignOn服务器,验证用户名与密码.
sys.connectService(AS400. SIGNON);  
值得一提的是,IBM Java Toolbox for i并不是从零开始设计基于Profile Token的框架,而是直接依赖已有的Java Authentication Authorization Service (JAAS)框架。
至此,样例应用程序成功利用HTTP服务器完整验证功能,并生成相应地Profile Token,然后传递给IBM Java Toolbox for i,利用其面向对象的编程模型,构造AS400对象,完成与IBM i服务器的连接。
 
基于Profile Token的验证 vs 基于密码的验证
通过对比基于密码与基于Profile Token的策略,我们发现,从编程的角度,我们最终的目标是构造AS400对象,实现与IBM i服务器的连接。所不同的是,基于Profile Token的策略不需要将密码暴露给上层Web应用,并且由HTTP服务器生成的Profile Token实现与IBM Java Toolbox for i实现无缝对接,既提高了Web应用程序的安全性,又简化了编程,而这正是IBM Java Toolbox for i的优势所在。
基于Kerberos认证的第三方身份验证策略
实际上,基于Profile Token的身份验证策略是一种第三方身份认证策略,同样,IBM Java Toolbox for i还支持另一种基于身份认证的第三方认证策略——Kerberos认证。Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。Kerberos认证的中心是Ticket,与Profile Token非常类似。Kerberos验证策略的优势是单点登录,只需输入一次验证即可以获取凭据(Ticket)。更多有关Kerberos认证相关的信息,请参见IBM i信息中心。 
 
与Profile Token一样,IBM Java Toolbox for i也并不是从零开始设计基于Kerberos验证的框架。Java的应用程序编程接口Java General Security Services (Java GSS)对Kerberos提供了编程语言级别的支持。 
 
下面,我们结合样例Web程序,介绍如何使用IBM Java Toolbox for i实现基于Kerberos的第三方身份验证。清单五显示的是如何使用IBM Java Toolbox for i与Kerberos相关的API构造AS400对象。
清单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均提供了强大而灵活的编程接口支持。
参考资源
 作者  pi guang ming 
 

[{"Business Unit":{"code":"BU009","label":"Systems - Cognitive"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":""}]

UID

ibm11145056