一种模块化用户认证服务的设计与实现

时间:2022-07-21 04:18:32

一种模块化用户认证服务的设计与实现

摘要:在远程教育信息化建设中,经常需要为一些阶段性活动构建网络平台,而这类网络平台往往需要进行统一身份认证。本文给出了一种基于HttpModule的应用系统用户认证服务方案,并通过SOA架构进行实现,使不同的应用系统能够通过统一的、可配置和重用的HttpModule认证模块实现轻量级用户统一认证功能,从而达到降低开发成本,提高开发效率的目的。

关键词:HttpModule;;SOA;认证服务

中图分类号:TP393 文献标识码:A 文章编号:1673-8454(2012)03-0086-05

一、引言

在远程教育快速发展的今天,信息化系统随着远程教育事业的发展不断建设。近几年来,随着网络技术的蓬勃发展,利用B/S架构搭建的信息平台逐渐增多。为一些临时性大型活动或特定教学活动创建的Web应用程序存在应用时间短、系统构造简单、开发和维护周期短等特点。这些应用程序往往需要实现用户认证及识别功能,以往的做法是为每套Web应用程序重构身份认证模块到统一或各自的用户数据库进行验证,但这样不仅导致资源浪费,也不利于各个应用系统间用户身份信息的统一认证。

本文研究在,NET框架下,利用 HttpModule技术,实现基于SOA架构的可被 Web应用程序系统配置和重用的模块化用户认证服务,从而实现多个应用程序间统一用户身份认证。

二、SOA以及HttpModule介绍

1.SOA架构介绍

SOA的体系结构包括服务消费者、服务提供者和服务注册中心3个角色。

服务提供者是创建服务的实体。它可以从服务消费者处接受请求并可以远程执行所请求服务。服务提供者通过向注册中心服务接口信息以供服务消费者发现和访问服务。

服务注册中心提供了展示服务的功能。服务消费者可以通过查询存储有服务信息的服务注册库找到感兴趣的服务接口信息。

服务消费者是指需要使用服务的应用程序或服务。通过对注册中心的服务信息进行查询后,根据接口说明信息并使用某种传输协议与服务绑定并执行服务功能。如图1描述了SOA角色间的关系。

SOA是一种以服务为中心的体系结构,通过服务封装,每个服务都可以近似地看成是一个子应用程序。将这些子应用程序进行组合和调用可以创建满足业务需求的应用系统,SOA体系架构可以实时调用这些子应用程序。SOA的实现方法是一种自顶而下的设计方法。整个软件过程划分为服务的定义、描述、、发现、绑定、服务的编排(业务逻辑设计)和调用执行过程。软件的功能模块体现为服务组件、接口。

2.HttpModule模块介绍

在,NET框架环境中,当用户的HTTP请求到达IIS后,用开发的Web应用程序都是在运行时环境中处理,其工作流程如图2所示。

从图2可知IIS实际将用户的HTTP请求直接传给了运行时环境,为每个Web应用程序维护一个HttpApplication类实例,并把用户的HTTP请求交给这个实例来处理,这个HttpApplication类的实例包含了一组类对象,如HttpModule类对象和HttpHandler类对象等,它们分别实现和HTTP协议处理有关的各种功能。在HttpApplication类的实例处理用户HTTP请求的过程中,这些类对象的方法会根据需要依次被调用,最后形成应答返回给用户,从而形成了一条处理HTTP请求处理管道。

HttpModule是实现了System.Web.IHttpModule接口的NET组件。这些组件通过在某些事件中注册自身,把自己插入请求处理管道中。当这些事件发生的时候,调用对请求有关的HttpModule,这样该HttpModule就能处理请求了。

三、基于HttpModule模块的用户认证服务设计

1.设计思路

由于短期使用的Web应用系统实际上都是一个独立的B/S结构的应用子系统,因此在用户身份认证设计上,采用单点登录思想对用户身份认证过程进行设计,为独立的Web应用系统设计一个独立的用户身份认证模块。结合SOA架构将用户身份认证模块封装并以服务调用的方式提供给各个Web应用系统使用。

用户登录系统的身份认证技术主要有两种。一种是基于用户口令的认证,当用户登录系统时,提示用户输入用户名和口令。系统核对用户输入的信息与系统内储存的用户信息是否一致,如果一致,则证明用户身份有效;如果不一致,则证明用户身份无效。另一种方法是基于证书的认证。当用户访问系统时,服务器请求客户端提交的用户认证证书信息,对于用户证书进行解密和验证后,确认用户身份是否有效。这两种用户身份认证技术都在目前的用户身份认证设计中得到广泛的应用,并根据实际情况有了许多安全性方面的扩展。由于所涉及Web应用系统通常并不涉及高安全性,因此采用基于口令的认证技术比较妥当。

采用B/S结构的 Web应用子系统最大的特点是:Web功能页面可以通过URL地址直接进行访问。如果不在页面调用时进行用户访问控制。用户就有可能绕过系统登录验证模块而直接使用系统功能。因此。对于B/S结构的系统而言,通过增加页面级的访问控制功能来保证系统功能不被非法调用是最有效,也是最可靠的途径之一。因此根据调用方式的不同,用户身份认证模块可以分成两个方面来设计,分别用于实现本地系统用户身份认证以及跨系统用户身份共享。

(1)本地用户认证设计

根据系统设计思想,本地用户认证工作流程如图3所示。

由图3可知,本地系统页面用户身份认证过程主要分为两步。系统在收到用户的页面访问请求后,首先验证在系统中存储的用户令牌(Token)是否存在,如果存在,则继续判定用户令牌是否有效。第二步是对用户令牌有效性进行认证,只有认证通过才能跳转到用户请求的业务模块界面中。用户令牌认证通过后,对系统用户令牌验证信息进行更新,系统将使用更新后的用户令牌验证信息验证接下来提交的用户令牌。在这个过程中,对于用户令牌的存在以及有效性验证,都是在一个用户认证模块中进行。系统业务模块页面在被调用时都先执行用户身份验证模块功能,随后才初始化页面并提供给用户具体的业务功能。如果验证没有通过,系统则初始用户认证信息,并跳回系统登录页面。

(2)跨域用户认证设计

作为可供各个Web系统调用和加载的用户身份认证模块,除了实现系统内页面的用户身份认证功能,还应该实现系统间用户身份共享和互认功能。对于使用同一用户身份认证模块进行用户身份认证的 Web应用子系统,可以使用统一的用户令牌验证机制来处理。如图4所示。

对于跨Web系统的功能页面调用,用户首先在源系

统页面中提交页面跳转请求。源系统页面在收到请求后,需提供源系统中存储的用户令牌信息以及所请求的目标系统页面URL地址,并将这些信息发送给目标系统。被调用的目标系统收到这些信息后。在系统用户认证模块中对提交的用户令牌信息进行验证,如果验证通过,则跳转用户请求的业务功能页面。如果目标系统中不存在相同的用户令牌,还需将有效的用户令牌信息在目标应用系统中进行构建和存储。为目标系统的本地页面用户身份认证提供信息。如果验证没有通过,目标系统将调至目标系统登录页,要求用户重新输入用户口令来确认用户身份。

2.用户令牌的验证与管理

根据上节在,NET Web应用系统中用户身份认证模块的设计思路,结合Web应用程序中的HttpModule模块实现用户页面身份认证功能。这样设计的好处在于通过将用户身份认证模块在HttpModule中封装,实现了用户认证模块的独立实现。而通过在用户界面子系统中加载封装的用户身份认证模块实现用户统一身份认证。由于应用子系统中的HttpModule模块在每次用户与程序的HTTP请求中都被调用,因此也实现了,NET页面级的用户身份统一认证。

根据SOA的设计原则,用户认证以及信息管理模块被封装在用户管理服务中,因此,用户认证模块也通过服务调用的方式进行具体实现。用户使用用户名及密码成功登录系统后,对于用户的认证采用令牌验证机制。系统令牌的发放规则是:对于使用一个IP地址的一名用户发放唯一的用户令牌。也就是说,同一个用户在一网计算机上只拥有一个用户令牌。用户令牌由用户ID、获取的IP地址信息以及随机数组成,对三者进行组合后进行哈希运算构造令牌,验证其唯一性后发放给用户。并在服务端的用户信息数据库中记录已经登录的用户ID、IP地址以及用户令牌信息。 Web应用程序可以在Session以及页面隐藏控件中记录用户令牌值。

创建了用户令牌后,在用户登录一直到登出的过程中,要对用户令牌进行验证和管理。对于用户令牌的验证和管理,主要可分为以下四个方面进行设计:

(1)用户令牌的加密存储

用户令牌分别在系统Session以及用户信息数据库中进行存储,除了用户信息数据库中的令牌信息不加密以外,在Web应用系统中存储的用户令牌都进行加密。系统采用DES对称密钥加密算法进行加密存储,而所需的交换密钥采用IP地址与Web应用程序密钥设定值组合而成。系统管理员可以通过更换Web应用程序密钥设定值改变交换密钥的值。而这样的设计使不同的IP地址在一定时期内拥有不同的交换密钥。

虽然系统采用的是安全性不高的DES对称加密算法进行加密,但是加密的设计思想是“一次一密”,通过不断更换密钥来加强用户令牌的安全性。在Web子系统中储存的用户令牌都是加密存储,加密的密钥来自于本地IP地址以及系统设定值的组合。这样在本地加密的用户令牌也只有在本地能够解密。而该密钥无法对使用其他IP地址的用户令牌进行解密。系统管理员还可以通过设定值随时修改密钥,以增强系统安全性。而由于采用不同的密钥,对于同一段明文其对应的密文并不相同,因此非法访问者无法使用直接获取加密的用户令牌在其他计算机上验证通过。在不知道明文的情况下,这种方法增加了非法访问者通过密文猜出明文和密钥的难度。

(2)用户令牌系统内页面验证

在用户登录系统后使用的过程中,每访问一个页面。系统都会加载基于HttpModule的用户身份认证模块对具体的用户令牌进行有效性检查。每当用户期限验证通过后,会更新数据库中有效期限的值。如果用户令牌验证失败或者有效期超时,系统都会返回验证错误信息,并不允许用户继续访问系统页面。

由于系统是基于用户令牌机制进行用户身份认证,因此如何保证用户令牌的真实有效以及不可否认是实现这一设计思路的重要方面。用户令牌被设计成由用户ID、获取的IP地址信息以及随机数为基础进行编码组合后进行哈希运算构造。在用户令牌验证的过程中,通过查找Session中的用户ID信息以及HttpModule模块执行过程中获取的客户端IP地址信息找寻唯一的用户令牌信息,将数据库存储未过期的用户令牌信息与用户提交的用户令牌信息进行匹配,如果匹配成功,则认为验证成功。在数据库中定时将过期的用户令牌信息及时从数据库中删除,从而保证用户令牌信息数据库匹配的有效性。这样的验证规则也保证了用户令牌的不可否认性。

(3)用户令牌跨系统验证

在系统的建设中,可能还会存在多系统间需要相互认证的情况。此时用户在请求其他系统页面时,采用POST方式提交加密的用户令牌。目标系统页面收到用户HTTP请求后,获取提交的用户令牌,并采用统一的HttpModule用户验证模块对用户令牌进行有效性和正确性验证,如果验证通过,同样更新数据库中有效期限的值。如果用户令牌验证失败或者有效期超时,系统都会返回验证错误信息,并不允许用户继续访问系统页面。

由于应用程序系统独自维护Session信息,不同的应用程序系统之间Session信息无法共享,要实现用户信息、用户令牌信息的跨应用程序系统传递,最简单的办法就是将这些信息通过URL地址调用的RequestString信息进行传递,而在这样传递的过程中,采用了更加严格的审核和加密机制。

用户在请求跨系统页面调用前,首先通过页面类调用服务类中的交换密钥管理方法获取一个临时的、由服务器生成的交换密钥。这个交换密钥是由一串随机码组合而成,并且与提交请求的IP地址相关联,一个IP地址在同一时间内只能拥有一个交换密钥。源页面使用获取的交换密钥对用户令牌进行加密并通过URL进行发送,目标页面收到请求后,对URL中用户令牌部分进行解密。系统只支持本地页面传递,因此目标页面的Http-Module用户验证模块可以通过IP地址获取先前存储的交换密钥进行解密,随后提交服务类进行验证,验证通过后立即删除服务器存储的交换密钥信息。

(4)用户令牌的撤销

在数据库中增加自动处理用户令牌的脚本。如果用户正常退出,则按照所获取的令牌信息删除数据库中的用户令牌记录;若用户非正常退出,但是重新登录,系统将删除原有的令牌信息,使用新令牌作为用户身份认证的凭据;若用户非正常退出,但是长期没有登录,则采用用户令牌有效期限值与系统时间对比来判定用户令牌是否失效,一旦失效,则立即删除用户令牌信息。

四、模块化用户认证服务的实现

为了让各个Web应用系统能够使用统一的用户身份认证模块来认证用户,系统采用SOA架构进行实现,将整个用户认证服务功能分为两个部分进行开发。Web应用系统需要加载的用户身份认证模块作为

插件进行开发,而用户管理、用户身份认证以及服务器交换密钥管理功能在服务器端进行开发。

各个Web应用系统中加载的用户认证模块需要完成用户信息、令牌信息等认证信息收集,并提交给指定的用户认证服务,在服务端收到并验证信息后,服务端返回认证的结果。这样就将复杂的用户认证业务逻辑放在服务端实现,增加了系统的灵活性。即便用户认证的业务逻辑需要进行调整,应用于各个Web应用系统的用户认证模块仍然可以继续发挥作用,这使用户认证模块具备了一定的通用性。

在具体实现上,系统使用WCF技术进行开发。通过WCF技术中的WS-Security安全策略来加强客户端与服务端数据传送的安全性和可靠性,而在服务端对传送的已加密的用户令牌进行解密并验证,保证用户令牌的完整性和可信性。用户认证服务结构如图5所示。

1.认证服务端实现

(1)数据层实现

实现用户统一身份认证的一个前提是用户信息的统一。用户信息存储在一个统一的数据库中,而该数据库也用于存储用户令牌以及服务器临时交换密钥。对于用户令牌以及服务器交换密钥,通过编写存储过程,并在数据库中设置定时执行的数据库作业,可以利用存储过程实现对于用户令牌有效性的服务器端检查,如果存在已经失效或过期的用户令牌信息将及时进行删除。而使用同样的方法,也可以检查页面交互中服务器生成的交换密钥是否过期。通过这样的机制保证数据库用户令牌以及服务器交换密钥信息的有效性和及时性。

(2)业务逻辑层实现

在数据服务层中,通过构造一个独立的WCF服务库用于用户管理模块以及用户身份验证模块的实现。在用户管理服务中,主要提供以下服务方法供服务应用程序调用。

1)用户管理功能,用户管理功能无外乎对用户信息的增删改查,在服务类中提供了相应服务方法实现对用户信息的添加、更新以及删除功能。另外定义了查询方法用于完成用户信息的查询功能。

2)用户身份认证功能,在用户管理服务类中,通过定义相应的服务方法,提供了统一的用户身份验证功能。包括通过用户输人的用户名及密码验证用户登录信息是否有效,创建和验证以及撤销用户令牌,设置数据库同步令牌失效时间。

3)服务器交换密钥管理功能,除了用户令牌功能外,服务类还提供两个方法用于服务器生成交换密钥的管理负责交换密钥的创建和获取。

(3)服务层实现

作为基础服务类,用户管理服务类通过数据访问接口类实现对用户信息数据库的访问,并将业务层中的用户验证业务逻辑以服务的方式暴露出来,作为相应WCF服务接口供客户端调用。认证服务端使用WCF服务库项目进行开发,并封装为服务动态链接库(DLL文件),这样就可以使用一个独立的WCF应用程序进行反射绑定svc文件并出来。

2.客户端模块实现

(1)HttpModule模块建构

客户端利用中的HttpModule模块进行页面级用户身份验证。通过构造一个继承自IHttpModule接口的HttpModuel Validate类。将用户身份验证模块作为IHttpModule中的一个子类进行编程。重写IHttpModule类的Dispose()撤销方法以及Init()方法,在Init()方法中加上重写后的 application_AcquireRequestState()方法执行自定义HTTP功能,在该方法中获取HttpApplication实例,并查找页面上下文中的用户令牌,如果找到,在此方法中实现对WCF用户管理服务中的用户令牌验证方法的调用,如果验证成功,则调用同步数据库中的用户令牌失效时间,如果验证失败,则通过appplication.Response.Redirect()方法将请求页面引导到系统登录页。如果在HttpApplication实例的上下文中未找到用户令牌值。则通过获取application.Context.Request.RawUr1值查询用户请求的URL地址中是否以Requeststring值的形式提交了用户令牌信息,如果有则进行验证。验证通过后,在系统中重建名称为UserToken的Session值。并重写请求URL地址,在地址栏中隐藏用户令牌信息。从而实现跨系统的用户令牌验证和重建。

在用户认证的过程中,自定义HttpModule所获得的用户令牌值是一个经过加密的值,该值在HttpModule中进行解密并提交给用户管理服务。而在提交的过程中,由于用户管理服务采用的是WCF服务应用程序进行实现。在协议配置中配置为启用了传输安全的TcpBinding绑定协议。对用户令牌的安全转交给WCF服务安全机制来完成,也提高了用户令牌在网络传输过程中的安全性。

(2)客户端模块部署

完成基于HttpModule的用户认证模块开发后,在今后的应用子系统的开发或运维过程中,通过加载这个自定义的用户认证模块就可以实现统一用户认证功能,而不需要独立建构自己的用户认证模块。

用户认证模块加载的过程也比较简单。由于Http-Module用户验证类封装为一个动态链接库(DLL),因此在应用程序开发中,添加该类的引用,并且在web.config文件中将有关服务定义的节中加上用户认证服务的终结点信息以及绑定协议信息可以完成服务调用。而最关键的是在该文件配置节的节中加上自定义的HttpModules信息从而完成自定义HttpModule模块的调用。经过这样的配置后,在应用系统运行时,无论调用系统哪个页面,除了调用系统默认的HttpModule模块外。还会调用用户验证模块进行用户身份验证。

五、小结

随着远程教育事业的不断发展,基于Internet的网络应用系统建设会越来越普遍,随着时间的推移,一些小型的任务式网络应用系统会不断地新增和废弃。而利用SOA架构搭建基于HttpModule的用户认证服务系统。可以有效缩短一些网络应用系统的开放周期,无论在实际应用中存在多少,NET架构的网络应用系统,都可以利用和加载统一的HttpModule用户认证模块,实现跨系统的统一用户身份认证。

参考文献:

[1]魏东,陈晓江,房鼎益.基于SOA体系结构的软件开发方法研究[J].微电子学与计算机,2005,22(6).

[2]吴家菊,刘刚,席传裕.基于Web服务的面向服务(SOA)架构研究[J].现代电子技术,2005(14).

[3]古权.利用定制的HttpHandlers增强应用的方法[J].电脑知识与技术,2004(14).

[4]史红军.基于HttpModule的页面访问日志[J].科技资讯,2009(25).

上一篇:医院财务管理的环境控制与完善刍议 下一篇:如何在项目教学中改变高职新生的学习方式