首页 文章

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

提问于
浏览
0

Update 原来我需要做的就是升级到.NET Core 2.1!感谢大家的解决方案!


我有一个.NET Core 2.0控制台应用程序,需要向使用Windows身份验证(特别是NTLM)的API发出Web请求 . 这是我公司的内部API,我很难成功连接到它,继续获得401 .

My research

我检查了SO:

然后我发现这个问题是在.NET Core github中引发的,它说it has been resolved . 我试过关注a code example there但仍然无法正常工作 .

My code

这是我到目前为止,我改变了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;
    }
}

如果您有任何想法/建议,请告诉我 .

1 回答

  • 0

    对于.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;
        }
    }
    

    祝好运!

相关问题