【发布时间】:2019-05-11 00:19:50
【问题描述】:
更新 原来我需要做的就是升级到 .NET Core 2.1!感谢大家的解决方案!
我有一个 .NET Core 2.0 控制台应用程序,需要向使用 Windows 身份验证(特别是 NTLM)的 API 发出 Web 请求。这是我公司的一个内部 API,我很难成功连接到它,不断收到 401。
我的研究
我查看了 SO:
- NTLM authentication HttpClient in Core - 去年提出,没有给出正确答案,表示该问题将在以后的 .NET Core 更新中得到解决。
- Sending HTTP Headers with HTTP Web Request for NTLM Authentication - 这是在 2009 年,似乎与 .NET Core 无关。
- How to get HttpClient to pass credentials along with the request? - 这是 2012 年的,以为是那个,但在使用时仍然得到 401。
然后我在 .NET Core github 中发现了这个问题,上面写着 it has been resolved。我试过关注a code example there,但还是不行。
我的代码
这是我目前所拥有的,我更改了 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;
}
}
如果您有任何想法/建议,请告诉我。
【问题讨论】:
-
为什么不使用 .NET Core 2.1 而不是 2.0?甚至您的链接示例也表明它适用于 .NET 2.1。
-
我意识到,在我发布问题后(呜呜呜),现在更新 Visual Studio 并将使用 .Net Core 2.1 进行尝试,并将更新进度。
-
NTLM 和 Windows 身份验证是一回事吗?这对我来说适用于 Windows 身份验证 HttpClient = new HttpClient(new HttpClientHandler {UseDefaultCredentials = true})。我没有 CredentialsCache 的东西,不确定代码是否在后台做同样的事情。
-
@GeorgiGeorgiev 人们使用两者来表示 Windows 身份验证
-
@Trozza 长期支持版本是 2.1,而不是 2.0。 2.0 已经不受支持。无论如何,您都应该迁移到 2.1