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编码之前的内容有一些差异,比如+-等符号的原本符号都是_代替,这个还希望有更多的朋友来指出这里的缺点,感激不尽
积累小的知识,才能成就大的智慧,希望网上少一些复制多一些原创有用的答案