`

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单点登录流程及其他

    Java 单点登录(SSO)是指在多个系统或应用程序中,只需要用户登录一次,就可以访问所有相关系统或应用程序的机制。单点登录 OOS(Object-Oriented Security)通常包括身份验证(Authentication)和授权...

    java-cas单点登录服务端

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

    java 单点登录技术概述

    单点登录(SSO)是一种用户登录机制,允许用户在多个应用系统中只登录一次,便可以访问所有相互信任的应用系统。随着企业业务系统的不断增加,各个系统通常由不同的厂商在不同时间开发,运行在不同的平台上,采用...

    用Java实现单点登录

    单点登录(Single Sign-On,简称SSO)是一种网络用户身份验证的机制,允许用户在一次登录后,访问多个相互信任的应用系统而无需再次输入凭证。在Java中实现SSO,我们可以利用各种框架和技术,如Spring Security、...

    java实现单点登录_图例及相关代码

    5. 应用系统集成:单点登录系统需要与多个应用系统集成,以便用户可以使用单点登录来访问所有相互信任的应用系统。 Java 实现单点登录的优点包括: 1. 降低管理的消耗:单点登录系统可以降低管理的消耗,因为用户...

    java 单点登录

    ### Java 实现简单单点登录 (SSO) #### 1. 什么是单点登录 (SSO) 单点登录(Single Sign-On,简称 SSO)是一种常见的企业级解决方案,旨在简化用户的登录过程。SSO 允许用户只需进行一次身份验证即可访问所有相互...

    SAP 单点登录源码 集成文档 方案

    通过理解SAP Logon Tickets的工作机制,正确配置SAP系统和Web应用,以及利用提供的源码和文档,可以实现高效、安全的单点登录体验。在实际操作中,务必遵循最佳实践,确保系统的稳定性和安全性。

    基于Java语言的单点登录在数字资源整合中的应用.pdf

    单点登录(Single Sign On,SSO)是指用户只需要在一个入口点登录系统,即可访问所有相关的应用系统,而不需要重新登录其他系统。SSO解决了多系统、多用户登录和维护的问题,提高了用户体验和企业数字资源整合的效率...

    java单点登录

    Java单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个应用系统中登录后,无需再次认证即可访问其他相互信任的应用系统。这种机制极大地提高了用户体验,减少了用户记忆多个密码的困扰,...

    SSO 单点登录(java)

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后,能够访问多个相互关联的应用系统,而无需再次输入凭证。在Java环境下实现SSO,通常涉及以下几个核心知识点: 1. **原理**:SSO的核心思想...

    java sso 单点登录 demo

    Java SSO(Single Sign-On)单点登录是一种网络身份验证机制,它允许用户在一次登录后,访问多个相互信任的应用系统而无需再次进行身份验证。SSO的核心思想是:用户只需要在一个应用系统中登录,然后就可以在整个...

    最新java实现简单的单点登录

    单点登录(Single Sign-On,简称SSO)是一种在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的技术。在Java Web环境中实现单点登录,可以提高用户体验,减少用户记忆多套账号密码的负担,...

    java LDAP+CAS单点登录

    Java LDAP+CAS单点登录是一种常见的企业级身份验证和授权解决方案。这个技术组合允许用户只需登录一次,就可以访问多个相互独立的应用系统,提高了用户体验并增强了安全性。以下是对这个主题的详细解释: **LDAP...

    java跨域单点登录实现

    Java跨域单点登录(Single Sign-On,SSO)实现是一项关键的系统集成技术,它允许用户在多个应用系统中只需登录一次,就能访问所有相互信任的应用系统,无需再次进行身份验证。本项目代码着重展示了如何在Java环境中...

    java 单点登录源代码

    Java 单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一个应用系统中登录后,无需再次认证即可访问其他关联的应用系统。在Java Web开发中,SSO能够提高用户体验,减少频繁登录的繁琐过程。下面...

    基于java语言开发的cas单点登录系统

    **基于Java语言开发的CAS单点登录系统** CAS(Central Authentication Service)是一种广泛使用的开源单点登录(Single Sign-On,SSO)框架,主要由耶鲁大学开发并维护。它旨在提供一种简单、安全的方式,使得用户...

    基于Java EE的单点登录技术研究与实现.pdf

    研究者赵向梅在其论文《基于Java EE的单点登录技术研究与实现》中,设计并仿真实现了这两种单点登录系统,并证明了该系统能够有效解决当前Web应用系统面临的登录问题。通过使用Java EE平台的特性,实现了一个高效、...

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

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

Global site tag (gtag.js) - Google Analytics