7

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

有一个很好的描述 NTLM用于密码的加密,我用来实现这个,但我不确定如何验证用户的密码是否有效。

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

编辑:

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


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

我使用了samba.org 的 JCIFS 库。

请注意,以下方法仅适用于 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>

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

4

7 回答 7

19

您真正要问的是:在进行单点登录 (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”标头中编码的密码)的唯一方法是使用带有 Active Directory 域的 NETLOGON 服务的 NetrLogonSamLogon(Ex) DCERPC 调用控制者,它是目标帐户的权限,或对目标帐户具有“信任”权限。此外,为了正确保护 NETLOGON 通信,应使用安全通道加密,并且从 Windows Server 2008 开始需要。

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

  1. 窗户(当然)

  2. Samba - Samba 是一组用于 UNIX 的软件程序,它实现了许多 Windows 协议,包括必要的 NETLOGON 服务调用。事实上,Samba 3 对此有一个特殊的守护进程,称为“winbind”,其他程序(如 PAM 和 Apache 模块)可以(并且确实)与之交互。在 Red Hat 系统上,您可以执行 ayum 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 接受器,则应该使用它。

麦克风

于 2009-01-21T04:37:37.560 回答
2

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

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

于 2008-09-15T15:43:33.927 回答
2

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

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

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

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

  • 该域需要在 IEx 浏览器中列为受信任站点
  • 或使用使用 netbios 名称而不是 DNS 名称的 url。
  • 让它在 Firefox 中工作阅读这里
于 2008-08-22T12:24:49.097 回答
1

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

  1. 打开火狐浏览器
  2. 在地址栏中输入 about:config
  3. 在 Search texfield 中输入 network.automatic-ntlm-auth.trusted-uris
  4. 双击首选项名称并键入您的服务器名称作为字符串值
  5. 关闭选项卡
  6. 重启火狐。
于 2013-11-08T10:23:22.873 回答
1

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

于 2010-07-27T13:46:00.660 回答
0

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

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

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

你能更具体地说明你想要做什么吗?

于 2008-08-22T12:18:25.463 回答
0

我假设您想要获取针对 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 来完成

于 2008-08-22T12:25:52.840 回答