最近在项目中遇到一个需求,此需求场景就是:当用户登录了windows,若用户用的AD域账号登录,则用IE浏览器打开应用系统时,则不必再输入账号和密码,自动登录到系统。简单滴说,就是应用系统与AD域进行单点。
经过搜索得知,可以知道,HTTP协议中有个401状态表示当前用户未授权(401 Unauthorized),当要求用NTML方式提供用户信息时,IE浏览器会自动获取当前windows账户(前提是要浏览器勾选了“自动使用当前用户名和密码登陆”),服务器获取后将此信息向域服务器进行验证并返回登陆状态信息。
以上就是要实现的单点的原理。
那我们现在来看看,如果要实现这个需求,都有哪些方案。
1.人工获取到当前windows账户信息,然后应用服务器向域服务器进行验证;
此方案比较棘手的是要怎么获取到windows账户信息呢?可能账户名还比较容易获取,但是密码就别想微软会明文提供给你了。
2.利用现成的IIS服务器做中介,在用户登录应用服务器的时候,通过IIS服务器进行登录验证,然后根据其返回的信息进行登录处理;
此方案是行得通的,比较婉转,不那么雅观,这里就不多说了。
3.利用第三方的开源项目jcifs。
jcifs是运用的最多的。但是它有个缺点就是:不支持NTLM2协议。而windows vista或7以上的系统都是默认采用NTLM2协议的,而目前用户也都是windows7以上的操作系统,因此这个方案也比较纠结。最终,有了下面的方案。
4.利用有限制的Jespa。
这个是可以免费使用的,支持NTLM2协议,但是呢不开源也有license限制。
在这里Jespa我们只做研究,不做其它目的,方便大家学习交流。因为这个在网络上介绍的太少了。
那么从官网下载Jespa包后,里面会包含技术文档和一些使用例子。根据技术文档的介绍,我们可以一步一步进行操作,体验下它的提供的功能。
一、环境的搭建。
首先是要搭建AD域的环境,这个请谷歌。比较简单,但是要注意的是同时也要安装DNS服务,不然后面利用jespa提供的脚本进行创建的计算机账户会不成功。搭建好后,就可以找一台机器来加入这个AD域,如能成功加入这个域,则搭建成功。
二、利用jespa提供的脚步创建计算机账户。
目的原话是这样说的:
“to authenticate clients using NTLM such as with the HttpSecurityService (or HttpSecurityFilter),
SaslServer, or JAAS LoginModule, a Computer account must be created in Active Directory with a known
password as described in this section”
不过我们也可以不需要利用它提供的脚步进行创建,我们也可以手工创建一个出来,但是呢,手工创建的是不会有密码的,因此,手工创建完后还是需要利用它提供的脚步来创建密码。利用它脚本来进行创建有个好处就是:按照它的提示一步一步进行,最后它会自动生成一份配置文档给你。这份配置是后面项目的运行需要用到的。
三、配置如下所示:
#此处可采用的Provider包括(默认为NtlmSecurityProvider):NtlmSecurityProvider,LdapSecurityProvider,ChainSecurityProvider,WordPressSecurityProvider
provider.classname=jespa.ntlm.NtlmSecurityProvider
#以下user和pwd,当登陆采用Form Login时,才需要配置。如SSO采用IE内置弹出窗口,可不配置。
http.parameter.username.name=username
http.parameter.password.name=password
#当URL请求中,包含参数logout=1时,将删除会话,退出系统。
#例如:https://as1.busicorp.local/account/login?logout=1
http.parameter.logout.name =logout
#http.parameter.anonymous.name=anon
#当登陆验证失败或异常时,将转向该页面。该路径需包含工程名。
fallback.location= /login.jsp
#哪些页面不进入jespa filter/login.jsp,
excludes= /logout.jsp,/logoutConfirm.jsp,/resource/*#groups.allowed = BUSICORP\\Domain Admins
#
# NtlmSecurityProvider properties
#
#jespa.log.path 该路径经测试,必须为绝对路径。与工程路径无关
jespa.log.path = c://jespa.log
#jespa.log.level 3以上信息为Debug状态,如发布后需修改为1
jespa.log.level = 4
jespa.account.canonicalForm = 3
# Replace the following with properties determined in Step 1 of Installation
##域名
jespa.bindstr = test.com
jespa.domain.netbios.name = test
#可执行DNS解析Server IP
#jespa.dns.servers = 192.168.15.110,192.168.15.115
#jespa.dns.site = Paris
##以下帐号必须为Computer Account,而非普通User。可在AD Server,用jespa中的SetupWizard.vbs创建。由于AD不熟悉,其他方式不知如何创建
##注意创建Account时,无$ 此处配置必须有$
# Generated by the Jespa Setup Wizard from IOPLEX Software on 2014-10-28
#jespa.bindstr = testoa.com
jespa.dns.servers = 192.168.92.135
jespa.dns.site = Default-First-Site-Name
jespa.service.acctname = jespa1$@test.com
jespa.service.password = pej~43juz-83
四、利用它提供的web应用,进行测试
只要配置及Filter正确,运行后即可自动登录到域验证,并返回你的账户信息,根据它提供的账户名,就可以利用这个账户名来在自己的应用系统里面单点,很简单的。
五、一些需求定制
当然了,能自动登录是基本功能。但是如果有些用户不是域用户怎么办?这时候如果你不是域用户,则会弹出微软的验证框来进行账户信息填写。但是问题还是会存在的,因为你可能根本不是域用户,是应用系统里面的一个特殊用户,那么,这个就得利用应用系统本身提供的验证框架了。一直不消失的验证框很是让人蛋疼。因此,可以在其代码做一点定制让其若果不是域用户则跳转回应用系统本身的验证页面(不需要那么复杂,具体看配置文件的fallback.location注释)。
特别注意的是,配置参数需要特别严谨,小心别让Filter死循环了。感觉还有很多东西要说,但是有些东西只能意会不能言传,自己动手做了才会有了感觉。就这样吧,心情不太好,唉。