如何使用会话存储中存储的访问令牌通过HttpClient进行Web api调用?

我已经使用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');
                }
            });
        });

现在登录后,我想使用存储的访问令牌来通过控制器方法使用HttpClient执行api调用。我不知道如何传递存储的访问令牌进行api调用。 我编写了以下代码以使用HttpClient进行api调用。

 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.");
            }
        }

请建议我如何使用该存储的访问令牌?

dayue0618 回答:如何使用会话存储中存储的访问令牌通过HttpClient进行Web api调用?

当我们处理诸如会话存储或本地存储之类的Web存储时,我们正在使用javascript,jquery等在客户端进行处理。无法在服务器端代码中访问这些存储项。它们仅限于本地浏览器,并且可以从在浏览器上运行的客户端代码进行访问。             现在,根据您的条件,我认为您可以在服务器端进行会话。在本地存储中设置值的地方,而不是在其中放置对服务器上任何actionresult函数的ajax调用,然后在会话中设置该值。稍后在服务器端获取它。再次,如果您希望该值客户端,则需要再次执行ajax调用,并从控制器中的服务器端函数获取它。

,

好吧,如果我理解正确,请登录并创建一个令牌,然后从您的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.");
            }
        }

现在,如果您直接从javascript调用API端点,那么到那时您将需要它对您的客户端可用,因此从理论上讲。您可以做的就是将令牌也存储在客户端存储中,这样您就可以在需要时检索它,我可以看到您已经在客户端上进行了操作。

如果您在MVC控制器中需要它,则从会话中获取它,并将其传递到您的API端点。在这种情况下,您可以使用初始的额外调用,无论如何您都会在客户端获得令牌,因此在此之后,只需调用额外的MVC端点,将令牌传递给它并将其保存在会话中即可。如果需要,可以在客户端和后端同时使用它。

MVC和Web API的组合有点使所有事情混为一谈。原因是MVC显然可以访问Session,而Web API应该是无状态的,因此没有Session访问权限。从理论上讲,作为MVC应用程序一部分的Web API端点可以访问Session对象,尽管我会避免这样做。我更喜欢将Web API保留为一个完全独立的项目,但是我知道这并不总是可能的。

本文链接:https://www.f2er.com/3154404.html

大家都在问