【问题标题】:How do I use NTLM authentication with Active Directory如何在 Active Directory 中使用 NTLM 身份验证
【发布时间】:2008-08-22 11:55:45
【问题描述】:

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

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

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

编辑:

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


更新 - 我得到了这个工作,这就是我所做的

我选择了JCIFS library from samba.org.

请注意,以下方法仅适用于 NTLMv1,不适用于 NTLMv2。如果无法使用 NTLMv1 可以试试Jespa,它支持 NTLMv2 但不是开源的,也可以使用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>

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

【问题讨论】:

    标签: http authentication coldfusion active-directory ntlm


    【解决方案1】:

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

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

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

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

    1. Windows(当然)

    2. Samba - Samba 是一组用于 UNIX 的软件程序,它实现了许多 Windows 协议,包括必要的 NETLOGON 服务调用。事实上,Samba 3 对此有一个特殊的守护进程,称为“winbind”,其他程序(如 PAM 和 Apache 模块)可以(并且确实)与之交互。在 Red Hat 系统上,您可以使用 yum install samba-winbindyum install mod_auth_ntlm_winbind。但这很容易 - 设置这些东西是另一回事。

    3. Jespa - Jespa (http://www.ioplex.com/jespa.html) 是一个 100% 的 Java 库,它实现了所有必要的 NETLOGON 服务调用。它还提供标准 Java 接口的实现,用于以各种方式对客户端进行身份验证,例如使用 HTTP Servlet 过滤器、SASL 服务器、JAAS LoginModule 等。

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

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

    最后,有人提到使用 LDAP“简单绑定”作为临时密码验证服务。 LDAP 并没有真正设计为身份验证服务,因此它效率不高。也不可能使用 LDAP 实现 SSO。 SSO 需要 NTLM 或 SPNEGO。如果你能找到一个 NETLOGON 或 SPNEGO 接收器,你应该使用它来代替。

    迈克

    【讨论】:

      【解决方案2】:

      据我了解。
      NTLM 是 IIS 内置的身份验证方法之一。如果主机在所述活动目录的域上注册,它应该是自动的。需要注意的一件事是用户名应该是两种格式之一。

      • 域\用户名
      • username@domain.tld

      如果您尝试使用不同的活动目录,您应该使用表单样式身份验证和一些 LDAP 代码。

      如果您尝试使用 IIS 集成身份验证执行 Intranet 无零登录操作

      • 该域需要在 IEx 浏览器中列为受信任站点
      • 或使用使用 netbios 名称而不是 DNS 名称的 url。
      • 要让它在 Firefox 中工作,请阅读 here

      【讨论】:

        【解决方案3】:

        Apache 的ModNTLM 源代码可能会为您提供正确的指针。

        如果可能,您应该考虑改用Kerberos。它允许您针对 AD 对 Apache 进行身份验证,并且它是一个比 NTLM 更活跃的项目空间。

        【讨论】:

          【解决方案4】:

          查看Waffle。它使用 Win32 API 为 Java 服务器实现 SSO。有servlet、tomcat阀门、spring-security等过滤器。

          【讨论】:

            【解决方案5】:

            您可以通过在 Firefox 中执行以下步骤来解决 Firefox 身份验证弹出窗口:

            1. 打开 Mozilla Firefox
            2. 在地址栏中输入 about:config
            3. 在 Search texfield 中输入 network.automatic-ntlm-auth.trusted-uris
            4. 双击首选项名称并键入您的服务器名称作为字符串值
            5. 关闭标签
            6. 重新启动 Firefox。

            【讨论】:

              【解决方案6】:

              嗯,我不确定你想要完成什么。

              通常在内部站点上实现 NTLM 就像在 IIS 中网站属性的“目录安全”选项卡中取消选中“身份验证和访问控制”中的“启用匿名访问”一样简单。如果清除,您的 Web 应用程序用户将看到一个弹出的 NTLM 对话框。

              您无需编写任何与 Active Directory 交互的代码。 IIS 会为您处理身份验证。

              您能否更具体地说明您要做什么?

              【讨论】:

                【解决方案7】:

                我假设您想要获取针对 LDAP 帐户设置的一些属性 - 角色 - 部门等。

                对于coldfusion,请查看http://www.adobe.com/devnet/server_archive/articles/integrating_cf_apps_w_ms_active_directory.html

                还有cfldap标签http://livedocs.adobe.com/coldfusion/6.1/htmldocs/tags-p69.htm#wp1100581

                至于其他语言 - 其他人将使用各自的 API 来完成

                【讨论】: