Применение Authorization header в Http запросах для отправки через HttpClient

Помогите пожалуйста понять, почему так происходит и есть ли у этой проблемы какое-то решение.

Есть приложение которое отправляет http запросы используя один инстанс httpclient. Нужна возможность создать httpclient с дефолтными windows AD кредами, которые могут быть указаны явно, или взяты из CredentialsCache. Но также, должна быть возможность сделать запрос под другими, явно переданными кредами.

Когда я делаю запрос, явно передавая креды существующего в AD юзера, у которого нет прав, запрос выполняется под этими кредами и я получаю ожидаемую ошибку - все окей. Когда я делаю запрос, явно передавая креды несуществующего в AD юзера, вместо ожидаемого 401, запрос выполняется под теми кредами, с которыми изначально был создан httpclient.

В примере ниже, насколько я могу понять, запрос выполнится под DefaultNetworkCredentials, хотя я ожидаю 401.

class Program
    {
        static void Main(string[] args)
        {
            var client = new APIClient();

            var uri = new Uri("https://localhost:44444/myservice.local");
            var content = new StringContent("", Encoding.UTF8, "application/xml");
            var invalidCreds = new NetworkCredential("gshgljdsgs", "gjsgkljdsjg");

            var response = client.ProcessRequest(uri, content, invalidCreds).Result;
        }
    }

    public class APIClient
    {
        private HttpClient client;

        public APIClient(NetworkCredential credentials = null)
        {
            var handler = new HttpClientHandler() { Credentials = credentials ?? CredentialCache.DefaultNetworkCredentials };
            this.client = new HttpClient(handler);

            ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyError) => true;
        }

        public async Task<String> ProcessRequest(Uri uri, HttpContent content, NetworkCredential credentials = null)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, uri) { Content = content };

            if (credentials != null)
                request.Headers.Authorization = makeToken(credentials);

            var response = await this.client.SendAsync(request);

            return await response.Content.ReadAsStringAsync();
        }

        private static AuthenticationHeaderValue makeToken(NetworkCredential credentials)
        {
            var username = credentials.UserName;
            var password = credentials.Password;

            var blobCreds = ASCIIEncoding.ASCII.GetBytes($"{username}:{password}");
            var b64Creds = Convert.ToBase64String(blobCreds);
            return new AuthenticationHeaderValue("Basic", b64Creds);
        }
    }

Ответы (0 шт):