`

java应用系统单点登录

阅读更多

目标:使用域账户单点登录,并且IE浏览器能自动登录

查相关资料,知道HTTP协议中有401这个状态表示用户未授权,要求NTLM方式提供用户信息时,IE会自动取当前windows账户,其他浏览器会弹出对话框要求用户输入。服务器得到用户信息后交给域控验证。

以上是原理,IIS服务器是提供这样的实现,只需简单配置。但java服务器,如tomcat、jboss,都没有这样的功能,但在网上很容易搜到了一个第三方的开源项目实现了这个功能,他是jcifs

使用了最新版1.3.14,使用中首先出现了怪现象,问题A:jboss启动后,第一个发出请求的浏览器能正常进行当前用户的验证,以后的都报用户名或密码错误。

调试了好久,最终在每次验证完成后disconnect一下,问题就解决了。

好景不长,新问题出现了,问题B:项目在公司内部上线后,不停有用户登录不上,报500错误:the parameter is incorrect

为解决问题B,找了域控相关负责人,他提供了一些jcifs的配置方式,包括说在配置中要指定一个连接域控的用户名密码,但所有配置都不见效,最后他给了一个另外的域控IP,换上后居然不再有人报500错误了。

据了解,这个不出错的域控是老版本的,2003系统,出错的域控是2008系统。问题算是解决了吗?没有。因为公司马上要将所有域控都升级了,到时没有老版的域控给我们系统验证了。

查找解决方案途中,对问题A有了新发现,其实不用改代码,只要在配置中指定一个连接域控的用户名密码即可。虽然不知道原因。

再后来,一个同学通过抓包,发现了出500错的规律,查资料后,怀疑出错用户都是使用vista或win7用户,并得到了证实。原因是vista或win7默认采用NTLM2协议验证,JCIFS不支持NTLM2。

但 或许你会问,这跟新老域控有什么关系。这样解释:首先老版本域控也不支持NTLM2或默认采用了NTLM协议;其次,vista和win7系统默认采用 HTLM2并在服务器要求NTLM是也兼容NTLM。这样vista和win7用户在老域控下就使用了NTLM验证,在新域控下使用了NTLM2验证。

根据这位提供的宝贵资料,Google关键字 NTLM2 jcifs,果然找到了答案
http://jcifs.samba.org/FAQ.html#ntlmv2
http://www.ioplex.com/

引用

Q: Does jCIFS support NTLMv2?

A: Yes. As of 1.3.0, JCIFS fully supports NTLMv2 and uses it by default.

Note: The NTLM HTTP SSO Filter that used to be included with JCIFS cannot support NTLMv2. See the above question for details.

 

引用

Q: How do I do NTLM HTTP authentication (a.k.a Single Sign On) for my website?

A: See "Jespa"

 

引用

Jespa is a complete NTLM implementation in 100% Java that properly implements both the server and client side of NTLMv2, NTLMv1, NTLM2 Session Security and Key Exchange. Of particular interest to users of the old JCIFS SSO Filter, Jespa can properly authenticate NTLMv2 clients just like a Windows server does (using the NetrLogonSamLogon DCERPC call over NETLOGON w/ Secure Channel) and it includes an HTTP SSO Servlet Filter.

Note: Jespa uses JCIFS for DCERPC transport and some basic client side NTLM calculations. Jespa is not Open Source (although it is free for up to 25 users). Please contact IOPLEX Software support if you have any questions regarding Jespa.



但这个不是开源的,也可能是有限制的(free for up to 25 users),于是有自己修改jcifs的冲动。

但是...

引用

Note: The old SSO Filter that used to be included with JCIFS used a "man in the middle" technique that cannot support NTLMv2 and has therefore been removed from the JCIFS package.



为什么呢?

引用

Now regarding your question about the HTTP Filter not supporting NTLMv2:

The JCIFS NTLM HTTP Authentication Filter uses a "man in the middle"
technique whereby the web server simply marshals the NTLM
challenge-response tokens between the browser and an SMB server.
Specifically, when the browser triggers the Filter, JCIFS connects to
an SMB server (the "domain controller") and returns the "server
challenge" for that SMB connection to the browser. The browser
computes NTLM password hashes using the DC's challenge and the user's
password and sends them to the Filter which just forwards them to the
SMB server as if it were authenticating itself. Meaning, the browser
thinks it's authenticating with the web server when it's really
authenticating directly with the DC.

This "man in the middle" technique works fine with NTLMv1 however it
cannot work with NTLMv2. The NTLMv2 challenge also consists of "target
information" that includes the hostname of the target (among other
things). That target information is factored into the calculations of
the password hashes. So the problem is that target information for the
web server is different from the target information for the domain
controller and therefore the password hash computation will be wrong
as the browser will expect target information for the web server and
not the domain controller. This is done specifically to thwart "man in
the middle" scenarios. And thus the technique used by the JCIFS NTLM
HTTP Filter cannot be used with NTLMv2.

Finally, the JCIFS NTLM HTTP Authentication Filter is a hack. It is a
hack that has worked quite well and to our knowledge is secure but it
is not a correct implementation of an NTLM authentication acceptor. A
proper implementation would do as IIS would do which in the case of
NTLM would be to use the DCERPC NETLOGON service. Specifically, the
web server would generate it's own random challenge with the proper
target information, send that to the browser, collect the password
hashes and then call the NetrSamLogon RPC with the challenge that we
generated and the corresponding password hashes. Or, according to the
Heimdal project, it is also possible to use a form of Kerberos digest
authentication to validate this information.


看来要支持NTLM2方式的域验证,不是简单的修改jcifs,而是要去实现一个协议。况且这方面文档又很难找,真的是不太可能。

最后只能是折中办法:要么域控采用NTLM,要么客户端NTLM,就是不能两者都是NTLM2。域控降级到NTLM的方案被否定,不能为了一个应用而影响所有。所以只能限定客户端使用NTLM。

我 们采用当出错时显示帮助页面的方式,引导用户修改本地配置LM身份认证级别。

1,可以在本地安全策略里配置,计算机配置->windows设置->安全设置->本地策略->安全选项->网络安全:LAN管理器身份验证级别 ,改为非NTLMv2就可以。

2,提供一个注册表文件,将 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\LMCompatibilityLevel 修改为1即可

  • one.zip (330 Bytes)
  • 下载次数: 3
分享到:
评论
4 楼 shellfish 2012-09-27  
tho 写道
我们现在用的就是你提到的方法,明文设置了客户端用户名和密码。这样有两个问题,首先暴漏了某个用户的用户名、密码;其次密码要求定期修改,当密码修改时会引起登录失败,即便修改回原密码,也会引起短暂登录故障。
因此我还是特别倾向于disconnect


也有建议修改源码解决:
http://syzdcs.iteye.com/blog/1073305
3 楼 tho 2012-09-24  
我们现在用的就是你提到的方法,明文设置了客户端用户名和密码。这样有两个问题,首先暴漏了某个用户的用户名、密码;其次密码要求定期修改,当密码修改时会引起登录失败,即便修改回原密码,也会引起短暂登录故障。
因此我还是特别倾向于disconnect

shellfish 写道
引用
查找解决方案途中,对问题A有了新发现,其实不用改代码,只要在配置中指定一个连接域控的用户名密码即可。虽然不知道原因。


文中提到了,只要对应这样配置就可以不用disconnect了,比如:
<init-param>
<param-name>jcifs.smb.client.username</param-name>
<param-value>admssun</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.password</param-name>
<param-value>1234!qwer</param-value>
</init-param>

就可以了。

2 楼 shellfish 2012-09-21  
引用
查找解决方案途中,对问题A有了新发现,其实不用改代码,只要在配置中指定一个连接域控的用户名密码即可。虽然不知道原因。


文中提到了,只要对应这样配置就可以不用disconnect了,比如:
<init-param>
<param-name>jcifs.smb.client.username</param-name>
<param-value>admssun</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.password</param-name>
<param-value>1234!qwer</param-value>
</init-param>

就可以了。
1 楼 tho 2012-08-31  
你好,看了你的文章很有帮助。
文中提到解决A问题的时候,每次disconnect就可以了,能否告诉一下如何disconnect。这个不是配置的filter,然后getRemotuser()吗?

还有一个问题,IE可以获取windows系统客户端登录域的相关用户名等信息,如果chrome等其他浏览器怎么实现?有遇到的话希望不吝赐教,谢谢!

相关推荐

    java-cas单点登录服务端

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 CAS(Central Authentication ...

    java 单点登录

    本文除了从多个方面和角度给出了对单点登录(SSO)的全面分析,还并且讨论了如何将现有的应用和SSO服务结合起来,能够帮助应用架构师和系统分析人员从本质上认识单点登录,从而更好地设计出符合需要的安全架构。

    SSO 单点登录(java)

    单点登录,跨域访问,本示例的单点登录默认所有的应用采用统一的用户库,如果,各位的实际情况是各应用有各自独立的用户库,这个后续研究上传

    单点登录系统设计与实现源码

    由于用户还没有在单点登录系统上登录过,所以跳转到单点登录系统用户登录页面http://localhost:7771/SSOSite/SignIn.aspx 2、输入正确的用户名和密码(51aspx/51aspx),跳转到企业门户系统首页面...

    java实现可跨浏览器单点登录

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    CAS单点登录操作文档

    CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: • 开源的企业级单点登录解决方案。 • CAS Server ...

    CAS单点登录(SSO)教程

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS(Central Authentication ...

    其他系统与domino系统单点登录的实现方式.docx

    本文介绍一种,通过dominoLTPAToken的生成方式实现单点登录的方法。 【实现原理】 1.已经登录统一用户,从统一用或者门户点击应用 2.应用没有会话,重定向到统一用户登录 3.统一用户检测会话,重定向到应用并带上...

    单点登录sso-shiro-cas-maven

    spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库生成语句,采用的...

    java单点登录的实现与应用整合中SSO的技术实现

    java单点登录的实现与应用整合中SSO的技术实现

    单点登录个人总结

    单点登录,Single Sign On,也就是我们平时所说的SSO。一般大型的系统平台,都会用到这个东西。它解决了频繁登录、验证的过程,也就是用户...单点登录初学的入门 , 后面有相应演示的Demo,通过demo1,demo2,项目中的应用

    开源多租户IDaas产品-MaxKey 单点登录认证系统 v3.5.6GA官方源代码

    MaxKey单点登录认证系统,谐音马克思的钥匙寓意是最大钥匙,是业界领先的IAM身份管理和认证产品,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供安全、标准和开放的用户身份管理(IDM)、身份...

    SSO 单点登录实例

    SSO 单点登录(Single Sign On)的简称, SSO是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    SSC单点登录技术

    本文除了从多个方面和角度给出了对单点登录(SSO)的全面分析,还并且讨论了如何将现有的应用和SSO服务结合起来,能够帮助应用架构师和系统分析人员从本质上认识单点登录,从而更好地设计出符合需要的安全架构。

    CAS单点登录系统.doc

    CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: • 开源的企业级单点登录解决方案。 • CAS Server ...

    【MaxKey单点登录认证系统 v2.4.0 RC】企业级IAM身份管理和身份认证产品+RBAC权限管理.zip

    MaxKey(马克思的钥匙)用户单点登录认证系统(Sigle Sign On System),寓意是最大钥匙,是业界领先的企业级IAM身份管理和身份认证产品,支持OAuth 2.0/OpenID Connect、SAML 2.0、JWT、CAS等标准化的开放协议,提供...

    CAS单点登录demo.rar

    这个资源适用于具有一定Java编程和Web开发经验的开发人员,特别是那些对单点登录和身份认证系统感兴趣的开发者。 通过这个资源,你将学到以下关键技能和知识: CAS单点登录基本概念:了解CAS是什么,以及它如何在...

    java单点登录源码-azure-iot-sdk-java:用于将设备连接到MicrosoftAzureIoT服务的JavaSDK

    java单点登录源码适用于 Java 的 Microsoft Azure IoT SDK 构建状态 出于安全考虑,构建日志不公开可用。 服务环境 地位 掌握 预习 此存储库包含以下内容: 适用于 Java 的 Azure IoT 中心设备 SDK :将客户端设备...

    SSO CAS 单点登录实例SSOAuth+SSOWebDemo1+SSOWebDemo2.zip

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 较大的企业内部,一般都有很多的...

Global site tag (gtag.js) - Google Analytics