Применение 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);
}
}