当前位置: 首页 > 知识库问答 >
问题:

使用.net core 3.1和API的JWT令牌响应进行授权

平俊茂
2023-03-14

我是C#新手,我在ASP.NetCore 3.1 MVC网络应用程序中与授权作斗争。我知道谷歌上有很多说明,我已经阅读和观看了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接收了响应并获得了令牌,但是每次我提出请求时都要设置HttpClient标头。

共有1个答案

章睿
2023-03-14

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

据我所知,我们不能在用户登录时只设置一次httpclient头。通常,我们可以将令牌存储到会话或cookie中,然后在您想向webapi发送请求时从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();
        });
 类似资料:
  • 我有一个Web api终端,它给我JWT令牌。它不是一个完全授权的服务器。它只是可以生成一个JWT令牌。 现在我有另一个用 aspnet 核心编写的 Web 应用程序。其中在启动中.cs我添加了以下行,以便我可以使用收到的 JWT 令牌进行授权 我也有一个登录表单(在web应用程序中),用户输入用户名和密码,我发送到web api并获得令牌。为了保护web应用程序中的任何控制器,我只使用了[Aut

  • 我正在尝试使用JWT身份验证设置一个简单的Angularjs应用程序。 我给新注册的用户发了一封带有jwt令牌链接的邮件,以验证该邮件是否存在。链接如下所示: < code > http://127 . 0 . 0 . 1:3000/verify email/eyj 0 exaioijkv 1 qilchbgcioijiuzi 1 nij 9 . eyj 1c 2 vytmftzsi 6 injp

  • 寻求有关如何进行微服务授权的建议。 我使用spring/spring boot来提供所有的微服务 在使用JWT令牌到达实际微服务之前,我可以通过Spring Cloud网关进行身份验证,但是在授权方面,我不确定如何做到这一点。 我想在内部处理business microservice中每个endpoint的授权。 有没有办法将JWT令牌传递给微服务,或者我需要调用authserver来获取用户中的

  • 我想写一个应用程序,允许与数据交互的两种RESTful形式;常规REST CRUDendpoint和Web-UI。 过去,我在JS中实现了UI的大部分功能,这将调用常规的RESTendpoint。这很好,但对于这个应用程序,我想使用Qute来执行生成页面内容的大部分基本功能。但是,为了正确地管理endpoint并确保正确的RBAC控制,我需要通过cookie而不是普通的头来访问JWT。这似乎是可能

  • 我正在尝试与URL(python客户端)建立websocket连接,该URL需要传入jwt令牌,服务器(在GO中实现)在上侦听该请求,并应该通过解析令牌进行身份验证。 我试着用这部分代码来提出请求- 此请求命中运行此代码以验证此请求的服务器 func ParseFromRequest(req*http.Request,keyFunc-keyFunc)(令牌*令牌,错误){ } 每次,我都会得到“E

  • 如何确定Authorization: Bearer中使用的JWT令牌...是访问令牌或刷新令牌。换句话说,是什么阻止用户在授权头中使用他的JWT刷新令牌而不是访问令牌。 当我在本指南https://github . com/starkandwayne/ultimate-guide-to-uaa/blob/master/docs/refresh-tokens . MD # jwt-refresh-t