Как использовать токен доступа, хранящийся в хранилище сеансов, для выполнения вызова веб-API с помощью HttpClient? - PullRequest
0 голосов
/ 06 ноября 2019

Я выполнил вход с использованием ajax-вызова и сохранил токен доступа в хранилище сеансов, используя следующий код.

        $('#btnLogin').click(function () {
            $.ajax({
                url: 'http://localhost:59983/token',
                method: 'POST',
                contentType: 'application/json',
                data: {
                    username: $('#txtUsername').val(),
                    password: $('#txtPassword').val(),
                    grant_type: 'password'
                },
                success: function (response) {
                    sessionStorage.setItem("accessToken", response.access_token);
                    console.log("Success!!!!");
                    alert("Login Successful");
                },
                error: function (jqXHR) {
                    console.log("Failed!!!!");
                    $('#divErrorText').text(jqXHR.responseText);
                    $('#divError').show('fade');
                }
            });
        });

Теперь после входа в систему я хочу использовать сохраненный токен доступа для выполнения вызовов API с использованием HttpClient изметод контроллера. Я не знаю, как передать этот сохраненный токен доступа для вызова API. Следующий код, который я написал для вызова API с использованием HttpClient.

 using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:59983/api/flight");
            client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
            var responseTask = client.GetAsync("flight");
            responseTask.Wait();
            var result = responseTask.Result;
            if (result.IsSuccessStatusCode)
            {
                var readTask = result.Content.ReadAsAsync<IList<tblFlight>>();
                readTask.Wait();
                flights = readTask.Result;
            }
            else
            {
                flights = Enumerable.Empty<tblFlight>();
                ModelState.AddModelError(string.Empty, "Server error. Please contact administrator.");
            }
        }

Подскажите, пожалуйста, как использовать этот сохраненный токен доступа?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Когда мы имеем дело с веб-хранилищем, таким как хранилище сеансов или локальное хранилище, мы делаем это на стороне клиента, используя javascript, jquery и т. Д. К этому элементу хранилища нельзя получить доступ в коде на стороне сервера. Они ограничены вашим локальным браузером и доступны из клиентского кода, запущенного в браузере. Теперь для вашего состояния я думаю, что вы можете пойти на сессию на стороне сервера. Точка, в которой вы устанавливаете значение в локальном хранилище, вместо того, чтобы помещать туда, вызывает ajax-вызов любой функции actionresult на сервере и устанавливает значение в сеансе. Позже получите его на стороне сервера. Опять же, если вам нужно это значение на стороне клиента, вам нужно снова выполнить ajax-вызов и получить его из функции на стороне сервера в контроллере.

0 голосов
/ 06 ноября 2019

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

Кажется, что вы разместили кодсуществует в вашем контроллере MVC.

 using (var client = new HttpClient())
        {
            //here retrieve the token from where you stored it
            string accessToken = "whatever";


            client.BaseAddress = new Uri("http://localhost:59983/api/flight");
            client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
            var responseTask = client.GetAsync("flight");
            responseTask.Wait();
            var result = responseTask.Result;
            if (result.IsSuccessStatusCode)
            {
                var readTask = result.Content.ReadAsAsync<IList<tblFlight>>();
                readTask.Wait();
                flights = readTask.Result;
            }
            else
            {
                flights = Enumerable.Empty<tblFlight>();
                ModelState.AddModelError(string.Empty, "Server error. Please contact administrator.");
            }
        }

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

Если он вам нужен в вашемКонтроллер MVC, затем получите его из сеанса и передайте его конечной точке API. В этом случае вы можете использовать начальный дополнительный вызов, вы все равно получите свой токен на стороне клиента, после чего просто вызовите дополнительную конечную точку MVC, передайте ей токен и сохраните его в сеансе. Этот способ иметь его как на стороне клиента, так и на стороне сервера, если вам это нужно.

Комбинация MVC, Web API - это всего лишь подделка всего. Причина в том, что MVC, очевидно, имеет доступ к Session, в то время как предполагается, что Web API не имеет состояния, поэтому нет доступа к Session. Теоретически конечная точка Web API, которая является частью приложения MVC, может получить доступ к объекту Session, хотя этого я бы избегал. Я предпочитаю хранить Web API как отдельный проект, но знаю, что это не всегда возможно.

...