使用来自API的JWT令牌响应的.net核心3.1进行授权



我是C#的新手,在ASP中很难获得授权。Net Core 3.1 MVC web应用程序。我知道谷歌上有很多指令,我已经阅读和观看了3天,但无法解决这个问题,因为我发现的每一条指令都使用了另一种方式,我真的很困惑。

我的系统的想法是:

步骤1。我将用户名和密码张贴到我的API,它将使用JWT令牌(如果帐户正确(进行响应

步骤2。我解码令牌并获取我的网站的用户名、电子邮件和角色,为另一个请求设置HttpClient标头。

我的问题:

  1. 当用户登录时,如何以及在哪里只设置一次HttpClient头(使用我的令牌(
  2. 如果用户还没有登录,如何强制他们留在登录页面

这是我的登录方法

[HttpPost, AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel account)
{
string url = "accounts/signin";
var response = await new HttpClientHelper<LoginViewModel>().PostRequest(url, account);
var userToken = JsonConvert.DeserializeObject<UserToken>(response);
Console.Out.WriteLine(userToken.Token);
if (userToken.Token != null)
{
var token = new JwtSecurityToken(jwtEncodedString: userToken.Token);
var userId = token.Claims.First(c => c.Type == "userId").Value;
var username = token.Claims.First(c => c.Type == "unique_name").Value;
var role = token.Claims.First(c => c.Type == "role").Value;
HttpContext.Session.SetString("token", token.ToString());
HttpContext.Session.SetString("userId", userId);
HttpContext.Session.SetString("username", username);
HttpContext.Session.SetString("role", role);
return RedirectToAction("Home", "Index");
}
return RedirectToAction("Login", "Login");
}

我的模型将从api 接收响应

public class UserToken
{
public string Token { get; set; }
public string ValidFrom { get; set; }
public string ValidTo { get; set; }

}

仅供参考:我已经收到了来自api的响应并获得了Token,但我每次发出请求时都会设置HttpClient头。。

当用户登录时,如何以及在哪里设置HttpClient标头(使用我的令牌(一次

据我所知,我们不能在用户登录时只设置一次httpclient标头。通常,我们可以将令牌存储到会话或cookie中,然后在您想向web api发送请求时从cookie或会话中读取它。

如果用户还没有登录,如何强制他们留在登录页面

对于这个需求,我建议您可以考虑使用身份验证中间件来实现您的需求。

您可以在该中间件中检查用户的会话,如果该用户不包含会话,则可以修改登录页面的请求路径。

更多详细信息,您可以参考以下示例:

//Below cods should add after app.usesession in startup.cs Configure method
app.Use((context, next) =>
{
string token = context.Session.GetString("token");
if (token == null)
{
context.Request.Path = "/account/login";
}               
return next.Invoke();
});

最新更新