可以使用3种身份验证协议在Linux或任何其他平台上的Java和Active Directory之间执行身份验证(并且这些协议不仅限于HTTP服务):
Kerberos-Kerberos提供单点登录(SSO)和委派,但Web服务器也需要SPNEGO支持才能通过IE接受SSO。
NTLM-NTLM通过IE(和其他浏览器,如果配置正确)支持SSO。
LDAP-LDAP绑定可用于简单地验证帐户名和密码。
还有一种叫做“ ADFS”的东西,它使用SAML为网站提供SSO,并调用Windows SSP,因此实际上,这实际上是使用上述其他协议之一的一种round回方式。
每种协议都有其优势,但是根据经验,为了获得最大的兼容性,通常应该尝试“像Windows一样”。那么Windows做什么呢?
首先,两台Windows计算机之间的身份验证支持Kerberos,因为服务器不需要与DC通信,并且客户端可以缓存Kerberos票证,从而减少了DC的负载(并且Kerberos支持委派)。
但是,如果认证双方都不具有域帐户,或者如果客户端无法与DC通信,则需要NTLM。因此Kerberos和NTLM不会互斥,并且Kerberos不会淘汰NTLM。实际上,NTLM在某些方面比Kerberos更好。请注意,同时提及Kerberos和NTLM时,我还必须提及SPENGO和集成Windows身份验证(IWA)。IWA是一个简单术语,基本上意味着Kerberos或NTLM或SPNEGO协商Kerberos或NTLM。
使用LDAP绑定作为验证凭据的方法效率不高,并且需要SSL。但是直到最近,实现Kerberos和NTLM还是很困难,因此一直使用LDAP作为临时身份验证服务。但是在这一点上通常应该避免。LDAP是信息目录,而不是身份验证服务。将其用于预期目的。
那么,如何在Java中尤其是在Web应用程序的上下文中实现Kerberos或NTLM?
像Quest Software和Centrify这样的许多大公司都有专门提到Java的解决方案。我不能对它们进行真正的评论,因为它们是公司范围内的“身份管理解决方案”,因此,从查看其网站上的营销活动来看,很难确切说明正在使用什么协议以及如何使用这些协议。您需要联系他们以获取详细信息。
在Java中实现Kerberos并非难事,因为标准Java库通过org.ietf.gssapi类支持Kerberos。但是,直到最近出现了一个主要障碍-IE不会发送原始Kerberos令牌,而是发送SPNEGO令牌。但是,使用Java 6,已经实现了SPNEGO。从理论上讲,您应该能够编写一些可以验证IE客户端的GSSAPI代码。但是我还没有尝试过。多年来,Sun的Kerberos实施都是一个错误的喜剧,因此,基于Sun在该领域的往绩,在您掌握SPENGO的实现之前,我不会做出任何承诺。
对于NTLM,有一个名为JCIFS的免费OSS项目,该项目具有NTLM HTTP身份验证Servlet过滤器。但是,它使用中间人方法通过与NTLMv2不兼容的SMB服务器(逐渐成为必需的域安全策略)来验证凭据。因此,JCIFS的HTTP筛选器部分计划被删除。请注意,有许多衍生产品使用JCIFS来实现相同的技术。因此,如果您看到其他声称支持NTLM SSO的项目,请检查详细信息。
使用Active Directory验证NTLM凭据的唯一正确方法是通过带有安全通道的NETLOGON使用NetrLogonSamLogon DCERPC调用。Java中是否存在这样的东西?是。这里是:
http://www.ioplex.com/jespa.html
Jespa是100%Java NTLM实现,支持NTLMv2,NTLMv1,完全完整性和机密性选项以及上述NETLOGON凭据验证。它包括HTTP SSO筛选器,JAAS LoginModule,HTTP客户端,SASL客户端和服务器(具有JNDI绑定),用于创建自定义NTLM服务的通用“安全提供程序”等。
麦克风