当前位置: 首页 > 面试题库 >

在Linux上使用Java对Active Directory进行身份验证

松锐藻
2023-03-14
问题内容

我有一个使用Java针对Active Directory进行身份验证的简单任务。只需验证凭据,别无其他。假设我的域是“ fun.xyz.tld”,OU路径未知,并且用户名/密码是testu / testp。

我知道那里有一些Java库可以简化此任务,但是我没有成功实现它们。我发现的大多数示例都是针对LDAP的,而不是针对Active Directory的。发出LDAP请求意味着在其中发送OU路径,而我没有。同样,发出LDAP请求的应用程序应该已经绑定到Active Directory才能访问它…不安全,因为凭据必须存储在可发现的地方。如果可能,我想使用测试凭证进行测试绑定-这意味着该帐户有效。

最后,如果可能的话,是否有办法对这种身份验证机制进行加密?我知道AD使用Kerberos,但不确定Java的LDAP方法是否使用Kerberos。

有人有工作代码示例吗?谢谢。


问题答案:

可以使用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服务的通用“安全提供程序”等。



 类似资料:
  • 我正在尝试使与和一起工作。我试着按照spring-boot-sample-secure和spring-boot-sample-web-secure中的指南去做,但是我没有让它起作用。 我正在尝试构建一个没有任何ui交互的REST应用程序。因此,我发现这两个样品都不完全适合我的目的。目前我的解决方案是使用AOP。 解决方案对我有效。然而,我想知道这是否是一个好的解决方案。我很好奇是否有更好的解决办法

  • 我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。

  • 我是全新的RestTemboard和基本上在REST API也。我想通过Jira REST API检索我的应用程序中的一些数据,但取回401未经授权。在jira rest api留档上找到并发表文章,但不知道如何将其重写为java,因为示例使用curl的命令行方式。我将感谢任何建议或建议如何重写: 进入java使用SpringRest模板。其中ZnJlZDpmcmVk是用户名:密码的Bas64编码

  • 我即将开始开发一个REST服务,安全性是这个项目的一个重要方面,但我找不到一些关于如何实现它的明确信息。我的服务一开始会被Android应用程序使用,但以后可能会被其他平台使用。控制用户访问非常关键,因此对REST服务的和控制非常重要。 尽管我可以找到关于如何制作安全REST API的主题,比如这里,这里和这里的这个大的,但令我惊讶的是,所有这些主题都没有指向著名的标准、框架或经过时间测试的解决方