danyDude Ответов: 2

Проблема с авторизацией с помощью HttpClient


У нас есть внешнее приложение, которое имеет веб-API/сервис для использования из нашего внутреннего программного обеспечения или других приложений.

Во всяком случае, я просто не могу заставить HttpClient работать. Он работает со старыми веб-клиента, или с помощью RestClient среди других инструментов.Я просто не могу заставить его работать с HttpClient, и это действительно раздражает меня, так как я не знаю, почему. IP-адрес и ключ API являются поддельными.

Так что с RestClient и другими techonlogies это работает:

public async Task<List<Employee>> LoadEmployees()
        {
            var client = new estClient("http://99.99.99.99:8080/api/v2/employee/");
            var request = new RestRequest(Method.GET);
            request.AddHeader("cache-control", "no-cache");                     
            request.AddHeader("accept-encoding", "gzip, deflate");
            request.AddHeader("Host", "99.99.99.99:8080");           
            request.AddHeader("Cache-Control", "no-cache");
            request.AddHeader("Accept", "*/*");           
            request.AddHeader("Authorization", "apwerfhafdh>0923817adfhhasfd<9");
            request.AddHeader("Content-Type", "application/json");
            IRestResponse responseData =  await client.ExecuteGetTaskAsync(request);

            if (responseData.StatusCode == System.Net.HttpStatusCode.OK)
            {                
                List<Employee> emps = JsonConvert.DeserializeObject<List<Employee>>(responseData.Content);

                return emps;
            }
            else
            {
                throw new Exception($"{responseData.StatusCode} : {responseData.StatusDescription}");
            }            
        }


но с HttpClient я не могу заставить работать часть авторизации.

Что я уже пробовал:

Client= new HttpClient();
            Client.DefaultRequestHeaders.Accept.Clear();
            Client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));            
            Client.DefaultRequestHeaders.Add("Accept", "*/*");
            Client.DefaultRequestHeaders.Add("accept-encoding", "gzip, deflate");

            Client.DefaultRequestHeaders.Add("Authorization", "X-ApiKey apwerfhafdh>0923817adfhhasfd<9"); // I get Unathorized
//Client.DefaultRequestHeaders.Add("Authorization", "apwerfhafdh>0923817adfhhasfd<9"); // I get System.FormatException

            //CLient.DefaultRequestHeaders.Add("X-ApiKey", "apwerfhafdh>0923817adfhhasfd<9");   I get Unauthorized  
//Client       

F-ES Sitecore

Вы устанавливаете заголовок авторизации, чтобы быть разными вещами. В одном это просто ключ, в другом у вас есть X-Apikey перед ним.

2 Ответов

Рейтинг:
13

Thomas Daniels

Если я правильно понимаю, ваш API принимает только точную строку apwerfhafdh>0923817adfhhasfd<9 как заголовок авторизации. Причина, по которой HttpClient отклоняет это точное значение с помощью FormatException, заключается в том, что это недопустимое значение авторизации: допустимые значения авторизации имеют формат [type] [credentials], так как ваш X-ApiKey code формат. Если API дает несанкционированные данные, это означает, что API принимает только строго недопустимые значения авторизации, поэтому либо проверьте, действительно ли API поддерживает недопустимые значения авторизации тип или скажите тому, кто написал API, чтобы исправить эту проблему и убедиться, что есть какой-то действительный заголовок авторизации, который принят.


danyDude

Да, вы правы. Он принимает apikey только после авторизации. Не [authtype] [credentials], а просто [credentials]. Спасибо

Рейтинг:
1

Richard Deeming

Если вы не можете исправить API, обходным путем является вызов другого метода для добавления заголовка, как указано в этом ответе StackOverflow:
c# - добавление заголовков HttpClient генерирует исключение FormatException с некоторыми значениями - переполнение стека[^]
HttpHeaders.Метод TryAddWithoutValidation (System.Net.Http.Headers) | Microsoft Docs[^]

Client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "apwerfhafdh>0923817adfhhasfd<9");


danyDude

Спасибо, Ричард. Мне это удалось с помощью RestSharp NuGet-пакет/библиотека. Но здорово посмотреть, как заставить его работать с помощью HttpClient. Спасибо