gpt4 book ai didi

http - 如何在 Active Directory 中使用 NTLM 身份验证

转载 作者:可可西里 更新时间:2023-11-01 15:12:37 29 4
gpt4 key购买 nike

我正在尝试在我们的一个内部站点上实现 NTLM 身份验证,并且一切正常。我没有解决的一个难题是如何从 NTLM 获取信息并使用 Active Directory 进行身份验证。

有一个good description of NTLMencryption used for the passwords ,我曾经实现过这个,但我不确定如何验证用户的密码是否有效。

我正在使用 ColdFusion,但此问题的解决方案可以使用任何语言(Java、Python、PHP 等)。

编辑:

我在 Redhat Enterprise Linux 上使用 ColdFusion。不幸的是,我们不能使用 IIS 来管理它,而必须为此编写或使用第三方工具。

更新 - 我开始工作了,这就是我所做的

我去了 JCIFS library from samba.org.

Note that the method below will only work with NTLMv1 and DOES NOT work with NTLMv2. If you are unable to use NTLMv1 you can try Jespa, which supports NTLMv2 but is not open source, or you can use Kerberos/SPNEGO.



这是我的 web.xml:
<web-app>
<display-name>Ntlm</display-name>

<filter>
<filter-name>NtlmHttpFilter</filter-name>
<filter-class>jcifs.http.NtlmHttpFilter</filter-class>

<init-param>
<param-name>jcifs.http.domainController</param-name>
<param-value>dc01.corp.example.com</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>CORP.EXAMPLE.COM</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>NtlmHttpFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
</web-app>

现在所有匹配的 URL /admin/*将需要 NTLM 身份验证。

最佳答案

您真正要问的是:在执行单点登录 (SSO) 时,是否有任何方法可以验证 IE 和其他 HTTP 客户端提交的“WWW-Authenticate: NTLM” token 。 SSO 是当用户在执行 Ctrl-Alt-Del 时输入密码“单次”,工作站会记住并在必要时使用它来透明地访问其他资源,而无需再次提示用户输入密码。

请注意,Kerberos 与 NTLM 一样,也可用于实现 SSO 身份验证。当出现“WWW-Authenticate: Negotiate” header 时,IE 和其他浏览器将发送 SPNEGO 包装的 Kerberos 和/或 NTLM token 。稍后会详细介绍,但首先我会按要求回答问题。

验证 NTLMSSP 密码“响应”(如 IE 和其他浏览器提交的“WWW-Authenticate: NTLM” header 中编码的那些)的唯一方法是使用 NetrLogonSamLogon(Ex) DCERPC 调用与 Active Directory 域的 NETLOGON 服务对目标帐户具有权限或具有“信任”权限的 Controller 。此外,为了正确保护 NETLOGON 通信,应使用安全 channel 加密,并且从 Windows Server 2008 开始需要。

不用说,实现必要的 NETLOGON 服务调用的包很少。我所知道的只有:

  • Windows(当然)
  • Samba - Samba 是一组用于 UNIX 的软件程序,它实现了许多 Windows 协议(protocol),包括必要的 NETLOGON 服务调用。事实上,Samba 3 有一个特殊的守护进程,称为“winbind”,其他程序如 PAM 和 Apache 模块可以(并且确实)与之交互。在 Red Hat 系统上,您可以执行 yum install samba-winbindyum install mod_auth_ntlm_winbind .但这很容易——设置这些东西是另一回事。
  • Jespa - Jespa ( http://www.ioplex.com/jespa.html ) 是一个 100% Java 库,它实现了所有必要的 NETLOGON 服务调用。它还提供标准 Java 接口(interface)的实现,用于以各种方式对客户端进行身份验证,例如使用 HTTP Servlet 过滤器、SASL 服务器、JAAS LoginModule 等。

  • 请注意,有许多 NTLM 身份验证接受器没有实现必要的 NETLOGON 服务调用,而是执行其他一些最终导致在一种或另一种情况下失败的事情。例如,多年来,在 Java 中执行此操作的方法是使用名为 JCIFS 的项目中的 NTLM HTTP 身份验证 Servlet 过滤器。但是该过滤器使用了一种中间人技术,该技术导致了长期存在的“打嗝错误”,更重要的是,它不支持 NTLMv2。由于这些原因和其他原因,它计划从 JCIFS 中删除。有几个项目无意中受到了该软件包的启发,现在也同样注定要失败。在 Java 论坛中也发布了许多代码片段,它们解码 header token 并提取域和用户名,但对实际验证密码响应完全没有任何作用。我只想说,如果您使用这些代码片段之一,您不妨脱下裤子四处走动。

    正如我之前提到的,NTLM 只是几个 Windows 安全支持提供程序 (SSP) 之一。还有一个 Digest SSP、Kerberos SSP 等。但是 Negotiate SSP(也称为 SPNEGO)通常是 MS 在其自己的协议(protocol)客户端中使用的提供程序。协商 SSP 实际上只是协商 NTLM SSP 或 Kerberos SSP。请注意,仅当服务器和客户端在目标域中都有帐户并且客户端可以与域 Controller 充分通信以获取 Kerberos 票证时,才能使用 Kerberos。如果不满足这些条件,则直接使用 NTLM SSP。因此,NTLM 绝不是过时的。

    最后,有些人提到使用 LDAP“简单绑定(bind)”作为临时密码验证服务。 LDAP 并不是真正设计为身份验证服务,因此它效率不高。也无法使用 LDAP 实现 SSO。 SSO 需要 NTLM 或 SPNEGO。如果您能找到 NETLOGON 或 SPNEGO 接受器,则应改用它。

    麦克风

    关于http - 如何在 Active Directory 中使用 NTLM 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135/

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