如果设置了密码,则使用ntlm身份验证的curl请求将失败

时间:2016-08-25 15:00:43

标签: authentication curl passwords ntlm percent-encoding

我尝试从Microsoft Dynamics Nav WebService获取一些数据。 此服务使用NTML身份验证。

如果我在浏览器中打开webservice url并使用给定的凭据,一切正常。

为了设置WebService客户端的环境,我使用命令行检查一切是否正常工作,我在特定点上无法进行身份验证。

这就是我正在使用的命令:

curl --ntlm -u "DOMAIN\USERNAME" -k -v "http://hostname:port/instance/Odata/Company('CompanyName')/Customer"

该命令将提示输入密码。 我复制了密码,一切都很好。

但是当我使用此命令时,如果已包含密码,它将停止工作并且身份验证失败:

curl --ntlm -u "DOMAIN\USERNAME:PASSWORD" -k -v "http://hostname:port/instance/Odata/Company('CompanyName')/Customer"

密码包含一些特殊的字符,所以我尝试使用百分比编码,这根本没有效果。

研究这类问题非常困难。搜索curl + ntlm身份验证问题可以提供很多结果,但没有任何内容与此特定类型的问题相关。

你们中的任何人都有过这种问题的经验吗?

3 个答案:

答案 0 :(得分:2)

由于Cookie,我的身份验证问题。我在txt文件中解决了这个含有cookie的问题,并通过所有请求使用了这个文件。例如,在登录请求后我保存了这个cookie:

curl -X POST -u username:password https://mysite/login -c cookies.txt 

在下一个请求中,我使用了这个文件:

curl -X POST -u username:password https://mysite/link -b cookies.txt

这个解决方案对我有用,我不知道你的问题是否相似,但我想你可以试试这个。

答案 1 :(得分:0)

我长期以来一直在努力解决类似的问题,最后我发现了这个卷曲错误报告#1253 NTLM authentication fails when password contains special characters (british pound symbol £)

cURL中的NTLM身份验证仅支持密码中的ASCII字符!在Ubuntu上的7.50.1版本中仍然如此,但我在许多不同的发行版上测试了它,它总是相同的。这个bug也会破坏PHP中的curl_init()(在PHP7上测试)。解决这个问题的唯一方法是避免NTLM身份验证密码中的非ASCII字符。

如果您使用的是Python,那么您很幸运。显然,Python开发人员重写了cURL实现,如果你使用HttpNtlmAuth包,它可以使用非ASCII字符。

答案 2 :(得分:0)

尝试使用nltm标志。

类似这样的东西:

curl -v --proxy-nltm -u 'username:password' youproxy.com:8080 someURL


from > curl --help

 -x, --proxy [PROTOCOL://]HOST[:PORT] Use proxy on given port
     --proxy-anyauth Pick "any" proxy authentication method (H)
     --proxy-basic   Use Basic authentication on the proxy (H)
     --proxy-digest  Use Digest authentication on the proxy (H)
     --proxy-negotiate Use Negotiate authentication on the proxy (H)
     --proxy-ntlm    Use NTLM authentication on the proxy (H)