Использовать проверку подлинности NTLM в веб-запросе в .NET Core - PullRequest
0 голосов
/ 10 декабря 2018

Обновление Оказывается, все, что мне нужно было сделать, это обновить до .NET Core 2.1!Спасибо всем за решения!


У меня есть консольное приложение .NET Core 2.0, и мне нужно сделать веб-запрос к API, который использует проверку подлинности Windows (особенно NTLM).Это внутренний 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;
    }
}

Если у вас есть какие-либо идеи / предложения, пожалуйста, сообщите мне.

1 Ответ

0 голосов
/ 10 декабря 2018

Для .NET Core 2.1 у меня работает эта реализация, используя HttpClientFactory

В ConfigureServices(IServiceCollection services) в class Startup У меня есть это имя 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;
    }
}

Удачи!

...