在.NET Core中使用NTLM身份验证进行Web请求

8
更新 我只需要升级到.NET Core 2.1!感谢大家提供的解决方案!

我有一个.NET Core 2.0控制台应用程序,需要向使用Windows身份验证(特别是NTLM)的API发出Web请求。这是我们公司内部的API,我试图成功连接它,但一直得到401错误。

我的研究

我在SO上查阅了以下内容:

然后我发现了这个问题,在.NET Core github上提出,并且它说已经解决了。我尝试遵循那里的代码示例,但仍然无法工作。

我的代码

这是我目前的代码,我更改了Uri,因为它托管在公司网络上,但我希望这足以在本地运行。

public class NTLMProxy
{
    private readonly HttpClient _httpClient;

    public NTLMProxy()
    {
        _httpClient = CreateHttpClientWithNTLM();
    }

    public Task<HttpResponseMessage> GetUsers()
    {
        var httpRequest = new HttpRequestMessage(HttpMethod.Get, _httpClient.BaseAddress);

        return _httpClient.SendAsync(httpRequest);
    }

    public HttpClient CreateHttpClientWithNTLM()
    {
        var uri = new Uri("http://ntlmservice.com/services/api/foo");
        var credentialsCache = new CredentialCache { { uri, "NTLM", CredentialCache.DefaultNetworkCredentials } };
        var handler = new HttpClientHandler { Credentials = credentialsCache };
        var httpClient = new HttpClient(handler) { BaseAddress = uri };
        httpClient.DefaultRequestHeaders.ConnectionClose = false;
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        ServicePointManager.FindServicePoint(uri).ConnectionLeaseTimeout = 120 * 1000;  // Close connection after two minutes

        return httpClient;
    }
}

如果您有任何想法/建议,请让我知道。


2
为什么不使用.NET Core 2.1而是使用2.0?即使您提供的示例也说明它可以在.NET 2.1中工作。 - Uwe Keim
2
我意识到在发布问题后(哎呀),现在正在更新Visual Studio并将尝试使用.Net Core 2.1,并会在进展情况发生时进行更新。 - Troy Poulter
1
NTLM和Windows身份验证是一回事吗?这是我用于Windows身份验证的有效方法:HttpClient = new HttpClient(new HttpClientHandler {UseDefaultCredentials = true})。我没有CredentialsCache,不确定代码是否在后台执行相同的操作。 - Georgi Georgiev
@GeorgiGeorgiev 人们都使用这两个术语来表示 Windows 认证。 - Panagiotis Kanavos
@Trozza 长期支持版本是2.1,而不是2.0。2.0已经不再受支持。您应该尽快升级到2.1版本。 - Panagiotis Kanavos
1个回答

6

对于 .NET Core 2.1,我有一个使用 HttpClientFactory 的实现可以正常工作。

class StartupConfigureServices(IServiceCollection services) 中,我有一个名为 HttpClient 的注册:

        services.AddHttpClient("myName").ConfigurePrimaryHttpMessageHandler(_ => new HttpClientHandler
        {
            Credentials = new CredentialCache { 
                {
                    new Uri("url"), "NTLM", new NetworkCredential("username", "password", "domain")
                }
            }
        });

在需要 HttpClient 的位置,只需这样解决它:

var client  = _httpClientFactory.CreateClient("myName"); 

不要忘记在构造函数中注入工厂。
public class MyClass{
    private readonly IHttpClientFactory _httpClientFactory;

    public MyClass(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }
}

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接