2016-06-24 19 views
0

我有安装Microsoft Exchange 2010 NLTM认证的问题我想提出一个应用程序来从EWS交换一些数据,因为我已经在交易所启用NTLM服务器我需要确保我的请求遵循NTLM握手过程。我已经研究了这个过程,并且我明白它是由六个步骤组成的,可以进行四次握手。下面的代码片段解释清楚:NTLM挑战失败或不正确的顺序,向交易所2013

1: C --> S GET ... 

2: C <-- S 401 Unauthorized 
       WWW-Authenticate: NTLM 

3: C --> S GET ... 
       Authorization: NTLM <base64-encoded type-1-message> 

4: C <-- S 401 Unauthorized 
       WWW-Authenticate: NTLM <base64-encoded type-2-message> 

5: C --> S GET ... 
       Authorization: NTLM <base64-encoded type-3-message> 

6: C <-- S 200 Ok 

字母C代表客户端,字母S代表服务器。有关NLTM的更多信息,请参阅here,我也将其用作参考。

所以客户端发出到服务器以401响应,告诉它需要证明自己的身份,客户端的GET请求。它也在相应的头部中发送认证方法,在这种情况下是NTLM。然后客户端发送所谓的Type-1消息,其中包含客户端的主机名和域名。然后,服务器以包含NTLM挑战的所谓的Type-2消息进行响应。客户端然后用另一个请求,Type-3消息响应,其中包含用户名,域名,主机名和两个响应。

我也明白,NTLM身份验证连接,而不是要求我采取必要步骤,以确保连接保持活动状态。

我们确认我可以向EWS通过NTLM发送请求我使用了一种叫做SoapUI,送我的SOAP请求的工具。 SoapUI具有处理NTLM的内置功能,因此我只需在那里输入用户名,密码和域,并在发送请求时处理与服务器的NTLM握手。现在,所有这些都通过SoapUI正常工作,请求通过握手进行,最终我得到服务器的200响应。为了向您展示这一点,我使用Microsoft Message Analyzer来检查传入和传出的http请求。这些是SoapUI和从SoapUI发送初始请求时发生的服务器之间的请求。

SoapUI request

正如你可以看到这些请求,按照其握手是应该发生的形式上面的图。

现在的转折点。我通过我的应用程序做了所有这些,理论上也是如此。在我的基于节点的应用程序中,我使用this库向EWS发出请求,反过来它也使用this库来处理NTLM握手。所以除了我设置用户名,密码,网址,域名和主机名之外,我没有别的办法可以解决这个问题。所以我使用库来格式化我的请求,并发布它只是为了查看它无法通过NTLM进行身份验证。我查看了这两个库,我可以看到httpntlm遵循NTLM握手协议,并最终发送了一个合适的NTLM令牌,但我无法弄清楚什么是错误的。这是当我从我的应用程序发出请求时http流的样子。

Application HTTP

现在只要看一眼这个和以前的形象,你可以当场的差异。首先,没有验证头的初始请求和响应不存在。我不确定在这个NTLM握手中它们是否可选,所以当SoapUI没有时,库会省略它们?

而且为什么是第二图像的认证头到NTLMv2的所述第二图像中,只以在NTLM第一个。我知道NTLM有两个版本,我在服务器上启用了它们,但为什么它在请求中有不同的规定。我找不到任何指定NTLMv2的库。

在第二个图像中,似乎Type-2消息可能从未作为服务器的响应到达?

无论如何,我无法弄清楚这里发生了什么,以及为什么这个http流的主要区别。任何帮助,将不胜感激。

回答

0

更新了对[email protected]的NTLMv2支持。请参阅[email protected]模块。您可以安装1.2.0并在github页面上使用示例。

@nextews-javascript-api的开发标记,它将很快脱离开发(在github上跟踪里程碑0.9)。

在guthub中为此打开了一个问题,以获得更快的分辨率。