如何在Active Directory中使用NTLM身份验证
我正在尝试在我们的一个内部站点上实施NTLM身份验证,并且一切正常。我没有的难题之一就是如何从NTLM中获取信息并通过Active Directory进行身份验证。
我曾经实现过NTLM和用于密码的加密,这是一个很好的描述,但是我不确定如何验证用户的密码是否有效。
我正在使用ColdFusion,但是可以使用任何语言(Java,Python,PHP等)解决此问题。
编辑:
我在Redhat Enterprise Linux上使用ColdFusion。不幸的是,我们不能使用IIS来管理它,而必须为此编写或者使用第三方工具。
更新我得到了这个工作,这就是我所做的
我使用了samba.org的JCIFS库。
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>
现在,所有与/ admin / *
匹配的URL都将需要NTLM身份验证。
解决方案
回答
嗯,我不确定我们要完成什么。
通常,在内部站点上实施NTLM就像在IIS网站属性的"目录安全性"选项卡中取消选中"身份验证和访问控制"中的"启用匿名访问"一样简单。如果清除该设置,则Web应用程序用户将看到一个弹出的NTLM对话框。
我们无需编写任何与Active Directory交互的代码。 IIS为我们处理身份验证。
我们能更具体地说明我们要做什么吗?
回答
据我了解。
NTLM是IIS内置的身份验证方法之一。如果主机在所述活动目录的域中注册,则它应该是自动的。要注意的一件事是用户名应采用以下两种格式之一。
- 域\用户名
- 用户名@ domain.tld
如果尝试使用其他活动目录,则应使用表单样式身份验证和一些LDAP代码。
如果我们尝试使用IIS集成身份验证来进行Intranet No Zero Login(Intranet无零登录)操作
- 该域需要在IEx浏览器中列为受信任的站点
- 或者使用url使用netbios名称而不是DNS名称。
- 要在Firefox中工作,请点击此处
回答
我假设我们要获取针对LDAP帐户角色部门等设置的某些属性。
进行冷熔检查,请访问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来完成
回答
Apache的ModNTLM源可能会为我们提供正确的指针。
如果可能,应考虑改用Kerberos。它使我们可以根据AD对Apache进行身份验证,并且它是一个比NTLM更活跃的项目空间。
回答
我们真正要问的是:在执行单点登录(SSO)时,是否有任何方法可以验证IE和其他HTTP客户端提交的" WWW-Authenticate:NTLM"令牌。 SSO是用户输入Ctrl-Alt-Del的"单次"输入,并且工作站记住并根据需要使用它透明地访问其他资源,而无需再次提示用户输入密码。
请注意,像NTLM一样,Kerberos也可以用于实现SSO身份验证。当出现" WWW-身份验证:协商"标头时,IE和其他浏览器将发送SPNEGO包装的Kerberos和/或者NTLM令牌。稍后再详细介绍,但首先我将按要求回答问题。
验证NTLMSSP密码"响应"(如IE和其他浏览器提交的" WWW-Authenticate:NTLM"标头中编码的密码)的唯一方法是通过NetrLogonSamLogon(Ex)DCERPC调用,并使用Active Directory域的NETLOGON服务是目标帐户的授权者,或者与目标帐户具有"信任关系"的控制者。此外,为了正确保护NETLOGON通信,应该使用安全通道加密,并且从Windows Server 2008开始需要使用安全通道加密。
不用说,实现所需的NETLOGON服务调用的程序包很少。我唯一知道的是:
- Windows(当然)
- Samba-Samba是UNIX的一组软件程序,实现了许多Windows协议,包括必需的NETLOGON服务调用。实际上,Samba 3为此有一个特殊的守护程序,称为" winbind",其他程序(例如PAM和Apache模块)可以(并且可以)与之交互。在Red Hat系统上,我们可以执行
yum install samba-winbind
和yum install mod_auth_ntlm_winbind
。但这很容易-设置这些东西是另外一回事了。 - Jespa-Jespa(http://www.ioplex.com/jespa.html)是100%Java库,可实现所有必要的NETLOGON服务调用。它还提供了标准Java接口的实现,用于以各种方式(例如,使用HTTP Servlet过滤器,SASL服务器,JAAS LoginModule等)对客户端进行身份验证。
请注意,有许多NTLM身份验证接受器没有实现必要的NETLOGON服务调用,而是做了其他事情,最终导致一种或者多种情况下的失败。例如,多年来,在Java中执行此操作的方法是使用来自名为JCIFS的项目中的NTLM HTTP身份验证Servlet过滤器。但是该筛选器使用的是中间人技术,该技术导致了长期存在的"打ic错误",更重要的是,它不支持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接受器,则应改用它。
麦克风
回答
查看华夫饼。它使用Win32 API为Java服务器实现SSO。有servlet,tomcat阀门,弹簧安全性和其他过滤器。