.netcore是我的新手,我正在在docker容器上运行的Web api上工作,而在使用邮递员的同时,Web api可以很好地输出结果。我想在.netcore中制作一个程序,以调用webapi端点并获取响应,并在具有MVC的其他端点中使用该特定响应。
下面给出解释。
管理员的默认用户名和密码是默认设置,例如username:admin , password: helloworld
。管理员首次登录该api时需要一个新的个人密码,如下图的邮递员图所示。
登录api是:localhost://..../v1/users/login
第一个问题是如何使用.netcore在Authorization-> BasicAuth中提供值。 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; }
}
谢谢。
答案 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;