有迹象表明,可用于Java和Linux或任何其它平台上的Active Directory(和这些不只是特定的HTTP服务)之间进行认证3个认证协议:
的Kerberos - Kerberos提供单点登录(SSO)和委托,但Web服务器也需要SPNEGO支持才能通过IE接受SSO。
NTLM - NTLM通过IE(以及其他浏览器,如果它们配置正确)支持SSO。
LDAP - LDAP绑定可用于简单验证帐户名称和密码。
还有一种叫“ADFS”,提供SSO使用SAML调用到Windows SSP网站,所以在实践中它基本上使用的是其它上述协议之一的环岛路。
每个协议都有它的优点,但作为一个经验法则,为了获得最大的兼容性,您通常应该尽量“像Windows一样做”。那么Windows做什么?
首先,两台Windows计算机之间的身份验证支持Kerberos,因为服务器不需要与DC通信,并且客户端可以缓存可减少DC负载(因为Kerberos支持委派)的Kerberos票据。
但是,如果认证方不都有域帐户,或者如果客户端无法与DC通信,则需要NTLM。所以Kerberos和NTLM并不相互排斥,NTLM也不会被Kerberos废弃。事实上,在某些方面,NTLM比Kerberos更好。请注意,当提到Kerberos和NTLM时,我不得不提到SPENGO和集成Windows身份验证(IWA)。 IWA是一个简单的术语,基本上意味着Kerberos或NTLM或SPNEGO来协商Kerberos或NTLM。
使用LDAP绑定作为验证凭据的方式效率不高,需要SSL。但直到最近,实施Kerberos和NTLM都很困难,所以使用LDAP作为转换认证服务一直存在。但在这一点上,通常应该避免。 LDAP是一个信息目录,而不是一个验证服务。用它来达到预期的目的。
那么您如何在Java中实现Kerberos或NTLM,特别是在Web应用程序的上下文中?
有许多像Quest Software和Centrify这样的大公司都有专门提到Java的解决方案。我不能评论这些,因为它们是公司范围内的“身份管理解决方案”,因此,从他们的网站上查看市场营销的角度来看,很难确切地说明正在使用什么协议以及如何使用。您需要联系他们了解详情。
在Java中实现Kerberos并不难,因为标准Java库通过org.ietf.gssapi类支持Kerberos。然而,直到最近还有一个主要障碍 - IE不发送原始的Kerberos令牌,它发送SPNEGO令牌。但是对于Java 6,SPNEGO已经实施。理论上你应该能够编写一些可以验证IE客户端的GSSAPI代码。但我没有尝试过。太阳实施的Kerberos多年来一直是一个错误喜剧,因此基于Sun在这方面的记录,我不会对他们的SPENGO实施做任何承诺,直到您掌握了这只鸟。
对于NTLM,有一个名为JCIFS的免费OSS项目,它具有NTLM HTTP身份验证Servlet筛选器。但是,它使用中间人方法来验证与不与NTLMv2配合使用的SMB服务器(它正在慢慢成为必需的域安全策略)来验证凭据。由于这个原因和其他原因,JCIFS的HTTP过滤器部分计划被删除。请注意,有多个使用JCIFS实施相同技术的分拆。因此,如果您看到其他宣称支持NTLM SSO的项目,请检查细则。
使用Active Directory验证NTLM凭据的唯一正确方法是通过NETLOGON与Secure Channel使用NetrLogonSamLogon DCERPC调用。 Java中存在这样的事情吗?是。那就是:
http://www.ioplex.com/jespa.html
Jespa是一个100%的Java NTLM实现支持NTLMv2的,NTLMv1身份,充分完整性和保密选项和上述NETLOGON凭据验证。它包括HTTP SSO筛选器,JAAS LoginModule,HTTP客户端,SASL客户端和服务器(具有JNDI绑定),用于创建定制NTLM服务的通用“安全提供程序”等等。
迈克
`import com.sun.jndi.ldap.LdapCtxFactory;` - 这很可能只适用于Sun JVM。 – 2010-07-21 14:25:06