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编码之前的内容有一些差异,比如+-等符号的原本符号都是_代替,这个还希望有更多的朋友来指出这里的缺点,感激不尽

posted @ 2018-06-03 22:54  洛晨随风  阅读(189)  评论(0编辑  收藏  举报