2

我们正在使用 HttpClient 联系 REST 服务,我们知道这需要 NTLM 或协商授权。

问题是 HttpClient 将首先在没有授权的情况下联系服务(这称为挑战-响应吗?)。客户端以 401 被服务器拒绝,然后客户端才会使用 Authorization 标头向服务器发送请求。

我们可以通过在第一个请求中添加 Authorization 标头来避免这种往返吗?

我们正在创建这样的http-client(问题与“NTLM”和“Negotiate”相同):

    public Rest.IRestClient Create()
    {
        var credentials = new CredentialCache { { _uri, "NTLM", CredentialCache.DefaultNetworkCredentials } };
    #if NETCOREAPP2_2
        var handler = new SocketsHttpHandler { Credentials = credentials, MaxConnectionsPerServer = 100, UseProxy = false };
    #elif NET461
        var handler = new WebRequestHandler { Credentials = credentials, UnsafeAuthenticatedConnectionSharing = true, MaxConnectionsPerServer = 100, UseProxy = false };
    #endif
        var httpClient = new HttpClient(handler) { BaseAddress = _uri, Timeout = _timeout };
        httpClient.DefaultRequestHeaders.ConnectionClose = false;
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(HostMediaTypeTranslator.GetMediaType(_hostMediaType)));
        if (_defaultRequestHeaders != null)
        {
            foreach (var header in _defaultRequestHeaders)
                httpClient.DefaultRequestHeaders.Add(header.Name, header.Value);
        }
        ServicePointManager.FindServicePoint(_uri).ConnectionLeaseTimeout = 120 * 1000;  // Close connection after two minutes
        return new Rest.RestClient(httpClient, _hostMediaType);
    }

是否可以只创建我们自己的 NTLM 或 Kerberos 令牌并将其作为标头添加到 http-request?

4

1 回答 1

1

不,因为您误解了 NTLM 的工作原理,尤其是 NTLM 握手。

来自服务器的初始 401 拒绝响应还包含一个挑战/随机数。来自客户端的后续请求需要包含该质询,并使用身份验证帐户密码的哈希进行加密。

这就是 NTLM 的工作方式,并且无法绕过它,因为您不(并且故意不能)知道服务器将发送的随机数。

参考:https ://docs.microsoft.com/en-gb/windows/win32/secauthn/microsoft-ntlm

于 2019-09-09T06:53:34.417 回答