我正在尝试在我们的一个内部网站上实施NTLM身份验证,一切正常。我没有的一个难题是如何从NTLM获取信息并使用Active Directory进行身份验证。
有一个good description of NTLM和encryption used for the passwords,我曾用它来实现这一点,但我不知道如何验证用户的密码是否有效。
我正在使用ColdFusion,但这个问题的解决方案可以是任何语言(Java,Python,PHP等)。
编辑:
我在Redhat Enterprise Linux上使用ColdFusion。遗憾的是,我们不能使用IIS来管理它,而是必须为此编写或使用第三方工具。
更新 - 我做到了这一点,这就是我做的事情
我选择了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/*
的网址都需要NTLM身份验证。
答案 0 :(得分:19)
您真正要问的是:有没有办法验证IE和其他HTTP客户端在进行单点登录(SSO)时提交的“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服务调用的软件包非常少。我唯一知道的是:
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过滤器。但是,Filter使用了一种中间人技术,这种技术一直是造成长期“打嗝”的原因,更重要的是,它不支持NTLMv2。出于这些原因和其他原因,计划将其从JCIFS中删除。有几个项目无意中受到了这个项目的启发,现在也同样注定要失败。在Java论坛中发布了许多代码片段,它们解码标头令牌并拔出域名和用户名,但实际上并没有真正验证密码响应。可以这么说,如果你使用其中一个代码碎片,你可以随身携带裤子。
正如我之前提到的,NTLM只是几个Windows安全支持提供商(SSP)中的一个。还有Digest SSP,Kerberos SSP等。但是Negotiate SSP,也称为SPNEGO,通常是MS在其自己的协议客户端中使用的提供者。 Negotiate SSP实际上只是协商NTLM SSP或Kerberos SSP。请注意,只有在服务器和客户端都在目标域中具有帐户并且客户端可以充分与域控制器通信以获取Kerberos票证时,才能使用Kerberos。如果不满足这些条件,则直接使用NTLM SSP。因此,NTLM绝不是过时的。
最后,有些人提到使用LDAP“简单绑定”作为生成班次密码验证服务。 LDAP实际上并不是设计为身份验证服务,因此效率不高。使用LDAP也无法实现SSO。 SSO需要NTLM或SPNEGO。如果你能找到一个NETLOGON或SPNEGO接受器,你应该使用它。
麦克
答案 1 :(得分:2)
据我了解。
NTLM是IIS内置的身份验证方法之一。如果主机在所述活动目录的域中注册,则它应该是自动的。需要注意的一点是用户名应该是两种格式之一。
如果您尝试使用其他活动目录,则应使用表单样式身份验证和某些LDAP代码。
如果您尝试使用IIS集成身份验证执行Intranet No Zero Login事项
答案 2 :(得分:2)
答案 3 :(得分:1)
结帐Waffle。它使用Win32 API为Java服务器实现SSO。有servlet,tomcat阀门,弹簧安全和其他过滤器。
答案 4 :(得分:1)
您可以通过在Firefox中执行以下步骤来解析Firefox身份验证弹出窗口:
答案 5 :(得分:0)
通常在内部站点上实现NTLM就像在IIS中的网站属性的“目录安全性”选项卡中的“身份验证和访问控制”中取消选中“启用匿名访问”一样简单。如果清除它,那么您的Web应用程序用户将看到弹出的NTLM对话框。
您无需编写任何与Active Directory连接的代码。 IIS负责为您进行身份验证。
您能更具体地了解您的目标吗?
答案 6 :(得分:0)
我假设你想要获得一些针对LDAP帐户设置的属性 - 角色 - 部门等。
for 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