JWT 介绍
JWT(Json Web Token)是一种开放标准,已Json对象的方式在各方之间安全地传输信息
JWT登陆状态不在服务器端进行存储,而是通过秘钥生成一个具有有效时间的Token返回给前端,Token中包含类似用户的Id等信息 ,之后的请求将Token携带到服务器端认证,认证通过后可解析Token拿到用户标识进行后续操作
JWT官网地址: https://jwt.io
JWT结构:(格式: aaaaaa.bbbb.cccc)
(1)Header
(2)Payload 载荷,存放需要传递的数据(用户信息和认证信息等)
1 JWT 规定了7个官方字段,供选用。 2 1 iss (issuer):签发人 3 2 exp (expiration time):过期时间 4 3 sub (subject):主题 5 4 aud (audience):受众 6 5 nbf (Not Before):生效时间 7 6 iat (Issued At):签发时间 8 7 jti (JWT ID):编号
(3)Signature 签名(防止数据被篡改)
使用编码后(base64编码)的header和payload再加上我们提供的一个公钥,然后使用header中指定的签名算法进行签名。
作用是保证JWT没有被窜改过
JWT使用
引用:Microsoft.AspNetCore.Authentication.JwtBearer
1.在“appsettings.json”中配置信息存储:
1 "JwtSettings": { 2 "Issuer": "admin", 3 "Audience": "user", 4 "SecretKey": "dadf4t5gfg6hh6h6h" 5 }
2.通过依赖注入,将配置文件注入到我们的类对象中
创建类“JwtSettings”
1 public class JwtSettings 2 { 3 public string Issuer { get; set; } 4 public string Audience { get; set; } 5 public string SecretKey { get; set; } 6 }
在Startup.cs中注入:
1 //ConfigureServices 2 services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings")); 3 JwtSettings setting = new JwtSettings(); 4 Configuration.Bind("JwtSettings", setting); 5 JwtHelper.Settings = setting; 6 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) 7 8 //Configure 9 app.UseAuthentication();
3.创建JwtHelper.cs生成token
1 public class JwtHelper 2 { 3 private static JwtSettings settings; 4 public static JwtSettings Settings { set { settings = value; } } 5 public static string create_Token() 6 { 7 var claims = new Claim[] { 8 new Claim(ClaimTypes.Name, "zhangsan"), 9 new Claim(ClaimTypes.Role, "admin"), 10 new Claim(ClaimTypes.Sid,"wmcodetypeid") 11 }; 12 var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.SecretKey)); 13 var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); 14 var token = new JwtSecurityToken( 15 issuer: settings.Issuer, 16 audience: settings.Audience, 17 claims: claims, 18 expires: DateTime.Now.AddDays(1), 19 signingCredentials: creds); 20 var Token = new JwtSecurityTokenHandler().WriteToken(token); 21 return Token; 22 } 23 }
测试认证:
[HttpPost] [Authorize] public string GetOnlineCallerList() { TableData data = new TableData(); data = _service.GetOnlineCallerList(); return JsonHelper.Instance.Serialize(data); }
未在表头添加token认证,状态401
在表头添加token认证,状态200,返回成功。