使用httpClient.postasync进行Web api调用.netcore

时间:2019-06-21 14:14:36

标签: asp.net-core .net-core asp.net-web-api2 dotnet-httpclient razor-pages

.netcore是我的新手,我正在在docker容器上运行的Web api上工作,而在使用邮递员的同时,Web api可以很好地输出结果。我想在.netcore中制作一个程序,以调用webapi端点并获取响应,并在具有MVC的其他端点中使用该特定响应。

下面给出解释。 管理员的默认用户名和密码是默认设置,例如username:admin , password: helloworld 。管理员首次登录该api时需要一个新的个人密码,如下图的邮递员图所示。

登录api是:localhost://..../v1/users/login Login Admin

第一个问题是如何使用.netcore在Authorization-> BasicAuth中提供值。 api的主体如下图所示。 Setting new_password for Admin

设置new_password后,api的响应是令牌,如下所示。 Token Generated

然后在环境中使用特定令牌创建用户。下面给出了更清晰的问题的图像。 Token Save

最后,令牌随后用于进行其他API调用,例如创建用户。 API: https://localhost/..../v1/users 图片如下。 Creating a User

作为.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; }
    }

谢谢。

2 个答案:

答案 0 :(得分:0)

授权通过Authorization请求标头处理,请求标头将包含某种形式的令牌,该令牌以该方案为前缀。您在这里谈论的不是真正的基本身份验证。这样一来,您就可以传递用户名,并在每个请求中传递Authorization标头。您正在执行的操作仅是进行一次身份验证以获取auth令牌,然后使用该auth令牌来授权其他请求。在这种情况下,您实际上应该发布用户名并传递到请求正文中。然后,您将使用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!"))

答案 1 :(得分:0)

您想从响应中获取令牌吗?如是。试试这个:

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;