Использование httpClient.postasync для веб-API-вызовов .netcore

Я новичок в .netcore, я работаю над веб-API, которые работают в контейнере докеров, и при использовании почтальона веб-API работают очень хорошо, выводя результаты. Я хочу создать программу в .netcore, вызывающую конечные точки webapi, получение ответа и использование этого конкретного ответа в других конечных точках с помощью MVC.

Объяснение дано ниже. Имя пользователя и пароль по умолчанию для администратора установлены по умолчанию, например username:admin , password: helloworld. При первом входе администратора в систему api требуется новый личный пароль, как показано на рисунке Postman ниже.

API для входа: localhost://..../v1/users/login  Администратор входа

Первый вопрос: Как указать значения в Авторизации - ›BasicAuth, используя .netcore. Тело api выглядит как на рисунке ниже. Установка нового_пароля для администратора

После установки new_password ответ api представляет собой токен, как указано ниже. Токен создан

Затем конкретный токен используется в среде для создания пользователя. Изображение для более ясной задачи приведено ниже. Сохранение токена

Наконец, токен затем использовался для выполнения других вызовов API, таких как создание пользователя. API: https://localhost/..../v1/users Изображение ниже. Создание пользователя

Как новичок в языке .netcore, я действительно изо всех сил пытаюсь выполнять такие вызовы API, поскольку большинство обучающих программ, которые я пробовал, генерируют собственный токен из API, но здесь я просто хочу взять токен ответа и сохранить его, а затем использовать его в других вызовах API. Поддержка сообщества StackOverflow всегда была мне очень полезна.

Код, который я пытаюсь сделать, приведен ниже.

**Controller**

 public class Login_AdminController : ControllerBase
    {
        [Route("/loginAdmin")]
        [HttpPost]
        public async Task<string> LoginAdminAsync([FromBody] dynamic content)
        {
            LoginAdmin L = new LoginAdmin();
            var client = new HttpClient();
            client.BaseAddress = new Uri("https://localhost:9090");
            var request = new HttpRequestMessage(HttpMethod.Post, "/v1/users/login");
            var byteArray = new UTF8Encoding().GetBytes($"<{L.username}:{L.df_Password}>");
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

            var formData = new List<KeyValuePair<string, string>>();
            formData.Add(new KeyValuePair<string, string>("new_password", "helloWorld123!"));

            request.Content = new FormUrlEncodedContent(formData);
            var response = await client.SendAsync(request);
            Console.WriteLine(response);
            return content;
        }
   }
}
***Model***
    public class LoginAdmin
    {
        public string username = "admin";
        public string df_Password = "secret";
        public string new_Password { get; set; }
    }

Спасибо.


person Farrukh Ahmed Khan    schedule 21.06.2019    source источник
comment
Действительно сложно понять, в чем ваша проблема. Не могли бы вы четко указать, в чем проблема?   -  person Alex Riabov    schedule 21.06.2019


Ответы (2)


Вы хотите получить токен от ответа? Если да. Попробуй это:

var client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:12345/Api");
            var request = new HttpRequestMessage(HttpMethod.Post, "/token");

            var keyValues = new List<KeyValuePair<string, string>>();

            keyValues.Add(new KeyValuePair<string, string>("username", "yourusername"));
            keyValues.Add(new KeyValuePair<string, string>("password", "yourpassword"));

            request.Content = new FormUrlEncodedContent(keyValues);
            var response = client.SendAsync(request).Result;
            return response.Content.ReadAsStringAsync().Result;
person Y.Y.    schedule 21.06.2019

Авторизация осуществляется с помощью заголовка запроса Authorization, который будет включать какой-либо токен с префиксом схемы. То, о чем вы здесь говорите, на самом деле не является базовой аутентификацией. При этом вы буквально передаете имя пользователя и передаете заголовок Authorization с каждым запросом. Вы просто выполняете аутентификацию один раз, чтобы получить токен аутентификации, а затем используете этот токен аутентификации для авторизации дальнейших запросов. В этом сценарии вы действительно должны опубликовать имя пользователя и передать тело запроса. Затем вы должны выполнить аутентификацию на предъявителя с токеном для других запросов, используя заголовок Authorization. Тем не менее, чтобы охватить обе базы:

Обычная аутентификация

var token = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"));
request.Headers.Add("Authorization", $"Basic {token}");

Аутентификация на предъявителя

request.Headers.Add("Authorization", $"Bearer {token}");
// where `token` is what was returned from your auth endpoint

FWIW, List<KeyValuePair<string, string>> это просто Dictionary<string, string>. Лучше использовать настоящий шрифт. Тогда вы можете просто сделать formData.Add("new_password", "helloWorld123!") вместо formData.Add(new KeyValuePair<string, string>("new_password", "helloWorld123!"))

person Chris Pratt    schedule 21.06.2019