【问题标题】:Curl request with ntlm authentication fails if password is set如果设置了密码,则使用 ntlm 身份验证的 curl 请求将失败
【发布时间】:2016-08-25 15:00:43
【问题描述】:

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

如果我在浏览器中打开 web 服务 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 身份验证问题提供了很多结果,但与此类特定问题无关。

你们中的任何人都曾遇到过此类问题吗?

【问题讨论】:

    标签: authentication curl passwords ntlm percent-encoding


    【解决方案1】:

    由于 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
    

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

    【讨论】:

    • 也许我的问题描述得有点弱,但问题不是第二个请求需要另一个身份验证。我的问题是,一旦我将密码输入初始请求,身份验证就会失败。
    • -c 解决了我在单个请求中遇到的问题。我花了 2 天的大部分时间使用 Java 客户端和 cURL 调试 NTLMSSP 交换,甚至没有考虑到 HTTP401 与 WWW-Authenticate/Authorization 无关,而是缺少负载平衡器“粘性”cookie(即我是在请求/挑战/响应序列期间命中负载平衡器反向代理后面的多个 IIS 实例)
    【解决方案2】:

    我为类似的问题苦苦挣扎了很长时间,终于找到了这个 curl 错误报告#1253 NTLM authentication fails when password contains special characters (british pound symbol £)

    cURL 中的 NTLM 身份验证仅支持密码中的 ASCII 字符!在 Ubuntu 上的 7.50.1 版本中仍然是这种情况,但我在许多不同的发行版上对此进行了测试,并且始终相同。这个错误也会破坏 PHP 中的 curl_init()(在 PHP7 上测试)。解决这个问题的唯一方法是避免在 NTLM 身份验证密码中使用非 ASCII 字符。

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

    【讨论】:

      【解决方案3】:

      尝试使用 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)
      

      【讨论】:

        猜你喜欢
        • 2012-04-11
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-01-10
        • 2019-12-06
        相关资源
        最近更新 更多