gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:51:46 25 4
gpt4 key购买 nike

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

我知道有一些 Java 库可以简化这项任务,但我没有成功实现它们。我发现的大多数示例一般都针对 LDAP,而不是专门针对 Active Directory。发出 LDAP 请求意味着在其中发送一个 OU 路径,而我没有。此外,发出 LDAP 请求的应用程序应该已经绑定(bind)到 Active Directory 才能访问它......不安全,因为凭据必须存储在某个可发现的地方。如果可能的话,我想要一个带有测试凭据的测试绑定(bind) - 这意味着该帐户是有效的。

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

有没有人有工作代码的例子?谢谢。

最佳答案

有 3 种身份验证协议(protocol)可用于在 Linux 或任何其他平台上的 Java 和 Active Directory 之间执行身份验证(这些协议(protocol)不仅特定于 HTTP 服务):

  • Kerberos - Kerberos 提供单点登录 (SSO) 和委派,但 Web 服务器还需要 SPNEGO 支持才能通过 IE 接受 SSO。
  • NTLM - NTLM 通过 IE 支持 SSO(以及其他浏览器,如果它们配置正确)。
  • LDAP - LDAP 绑定(bind)可用于简单地验证帐户名和密码。

  • 还有一种叫做“ADFS”的东西,它为使用调用 Windows SSP 的 SAML 的网站提供 SSO,因此实际上它基本上是使用上述其他协议(protocol)之一的迂回方式。

    每个协议(protocol)都有它的优点,但根据经验,为了获得最大的兼容性,您通常应该尝试“像 Windows 那样做”。那么 Windows 是做什么的呢?

    首先,两台 Windows 机器之间的身份验证有利于 Kerberos,因为服务器不需要与 DC 通信,并且客户端可以缓存 Kerberos 票证,从而减少 DC 上的负载(并且因为 Kerberos 支持委派)。

    但是,如果身份验证方都没有域帐户,或者如果客户端无法与 DC 通信,则需要 NTLM。因此 Kerberos 和 NTLM 并不相互排斥,并且 NTLM 不会被 Kerberos 淘汰。事实上,在某些方面 NTLM 比 Kerberos 更好。请注意,在同时提及 Kerberos 和 NTLM 时,我还必须提及 SPENGO 和集成 Windows 身份验证 (IWA)。 IWA 是一个简单的术语,基本上是指 Kerberos 或 NTLM 或 SPNEGO 来协商 Kerberos 或 NTLM。

    使用 LDAP 绑定(bind)作为验证凭据的方法效率不高,并且需要 SSL。但是直到最近,实现 Kerberos 和 NTLM 一直很困难,因此一直使用 LDAP 作为临时身份验证服务。但在这一点上,一般应该避免。 LDAP 是一个信息目录,而不是身份验证服务。将其用于预期目的。

    那么您如何在 Java 中,尤其是在 Web 应用程序的上下文中实现 Kerberos 或 NTLM?

    Quest Software 和 Centrify 等许多大公司都有专门提到 Java 的解决方案。我不能真正评论这些,因为它们是全公司范围的“身份管理解决方案”,因此,从他们网站上的营销旋转来看,很难确切地说出正在使用哪些协议(protocol)以及如何使用。您需要与他们联系以获取详细信息。

    在 Java 中实现 Kerberos 并不难,因为标准 Java 库通过 org.ietf.gssapi 类支持 Kerberos。然而,直到最近还存在一个主要障碍——IE 不发送原始 Kerberos token ,它发送 SPNEGO token 。但是在 Java 6 中,已经实现了 SPNEGO。从理论上讲,您应该能够编写一些可以对 IE 客户端进行身份验证的 GSSAPI 代码。但我没试过。多年来,Sun 对 Kerberos 的实现一直是一部错误喜剧,因此根据 Sun 在该领域的记录,我不会对他们的 SPENGO 实现做出任何 promise ,直到您掌握了那只鸟。

    对于 NTLM,有一个名为 JCIFS 的 Free OSS 项目,它具有 NTLM HTTP 身份验证 Servlet 过滤器。但是,它使用中间人方法来验证与 NTLMv2 不兼容的 SMB 服务器的凭据(这正逐渐成为必需的域安全策略)。由于这个原因和其他原因,JCIFS 的 HTTP 过滤器部分计划被删除。请注意,有许多衍生产品使用 JCIFS 来实现相同的技术。因此,如果您看到其他声称支持 NTLM SSO 的项目,请查看细则。

    使用 Active Directory 验证 NTLM 凭据的唯一正确方法是使用 NetrLogonSamLogon DCERPC 调用通过 NETLOGON 和安全 channel 。 Java中存在这样的东西吗?是的。这是:

    http://www.ioplex.com/jespa.html

    Jespa 是一个 100% Java NTLM 实现,支持 NTLMv2、NTLMv1、完全完整性和 secret 性选项以及前面提到的 NETLOGON 凭据验证。它包括一个 HTTP SSO 过滤器、一个 JAAS LoginModule、HTTP 客户端、SASL 客户端和服务器(带有 JNDI 绑定(bind))、用于创建自定义 NTLM 服务的通用“安全提供者”等等。

    迈克

    关于java - 在 Linux 上使用 Java 对 Active Directory 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/390150/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com