• jwt 在.net core 2.0的使用


    jwt个人觉得更适合作共享session的传递格式,本身保密性不好,容易泄露重要信息,他的格式为头.一些用户的自定义声明.前两者的加密(公私对称密钥形式)

    需要引用nuget:

    System.IdentityModel.Tokens.Jwt

    服务端:

    [AllowAnonymous]
            [Route("GetToken")]
            [HttpPost]
            public IActionResult GetToken([FromBody]UserInfo user)
            {
                //if (!ModelState.IsValid) return BadRequest("Token failed to generate");
                //var userIdentified = _context.Users.FirstOrDefault(u => u.Username == user.Username);
                //if (userIdentified == null)
                //{
                //    return Unauthorized();
                //}
                //user = userIdentified;
    
                //Add Claims
                //一些用户的声明
                var claims = new[]
                {
                    new Claim(JwtRegisteredClaimNames.UniqueName, "data"),
                    new Claim(JwtRegisteredClaimNames.Sub, "data"),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                };
                //加密需要的key
                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("rlyaKithdrYVl6Z80ODU350md")); //Secret
                var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
                //完整的token
                var token = new JwtSecurityToken("http://localhost:8000",
                    "http://localhost:8001",
                    claims,
                    notBefore: DateTime.Now,    //从指定时候开始算起
                    expires: DateTime.Now.AddMinutes(1),   //从制定时候结束,这一段时间为jwt的过期时间,据说是这样的,但是只是一般声明的话,真的可以起作用吗,本人亲测过应该是可以的,但是还是觉得不是每次都好用
                    signingCredentials: creds);
                
                return Ok(new
                {
                    access_token = new JwtSecurityTokenHandler().WriteToken(token),
                    expires_in = DateTime.Now.AddMinutes(30),
                    token_type = "bearer"//bearer票据类型的token
                });
            }

    postman调用,得到基于base64编码的token:

    l客户端可以通过继承ActionFilterAttribute类去获取头部信息,然后判断里面的内容是否是自己需要的:

       var ret = filterContext.HttpContext.Request.Headers["Authorization"].FirstOrDefault();

    使用这个获取了token后,再根据.号分割出三部分,对前两部分分别进行base64的解码,即可获取服务端的用户内容

    解码方法可以参考:

     private string CreateToken(string message, string secret)
            {
                secret = secret ?? "";
                var encoding = new System.Text.ASCIIEncoding();
                byte[] keyByte = encoding.GetBytes(secret);
                byte[] messageBytes = encoding.GetBytes(message);
                using (var hmacsha256 = new HMACSHA256(keyByte))
                {
                    byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                    return Convert.ToBase64String(hashmessage);
                }
            }

    经本人测试,似乎这样的解码方式和原本的base64编码之前的内容有一些差异,比如+-等符号的原本符号都是_代替,这个还希望有更多的朋友来指出这里的缺点,感激不尽

  • 相关阅读:
    MongoDB 分片管理(一)检查集群状态
    MongoDB 副本集
    MongoDB 集群设置集合分片生效及查看集合分片情况
    mongodb 导入json文件遇到的坑
    GreenPlum/postgres copy命令导出/导入数据
    Mongo mongoexport/mongoimport介绍
    mongoDB之监控工具mongostat
    Oracle ORA-00600[2662] 解决
    ORA-00600[2662]问题 汇总
    MySQL的基本使用
  • 原文地址:https://www.cnblogs.com/llcdbk/p/9131133.html
Copyright © 2020-2023  润新知