我尝试从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身份验证问题可以提供很多结果,但没有任何内容与此特定类型的问题相关。
你们中的任何人都有过这种问题的经验吗?
答案 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)