前言
jwt是无状态,jwt信息只需要保存在客户端,无状态登录优势:分布式部署,jwt是通过token进行,jwt最重要部分是数字数字签名(VERIFY SIGNATURE),数字签名是通过非对称加密算法RSA,需要通过服务器私钥进行验证,如果私钥不丢失,基本上绝对安全(因为token是明文)。
JWT优缺点
优点:无状态,简单,方便,完美支持分布式部署
非对称加密,Token安全性高
缺点:1:因为是无状态,一经发布无法取消。(无解)
2:明文传递,token安全性低,知识通过base64加密
(使用https可以解决,可以通过https协议加密后进行展示)
需要的nuget包
安装管理包
如何获取jwt token
api接口
[Route("auth")]
[ApiController]
public class LoginController : ControllerBase
{
private readonly IConfiguration _configuration;
public LoginController(IConfiguration configuration)
{
_configuration = configuration;
}
[AllowAnonymous] //每个人都可以进行访问
[HttpPost("login")]
public IActionResult Login([FromBody]LoginDto loginDto)
{
//1:验证用户名和密码
//2: 创建jwt jwt 由3部分进行
// header
var signingAlgorithm = SecurityAlgorithms.HmacSha256;
// payload
var claims = new[]{
new Claim(JwtRegisteredClaimNames.Sub,"username")
};
// signiture
//下面是jwt需要的参数
//取数字签名的密钥
var secret = _configuration["Authentication:SecretKey"];
//进行转码
var secretByte = Encoding.UTF8.GetBytes(secret);
var signingKey = new SymmetricSecurityKey(secretByte);
var signingCredentials = new SigningCredentials(signingKey, signingAlgorithm);
var token = new JwtSecurityToken(
issuer: _configuration["Authentication:Issuer"],//谁发布的token
audience: _configuration["Authentication:Audience"],//这个token发布给谁
claims,//payload
notBefore: DateTime.UtcNow,//发布时间
expires: DateTime.UtcNow.AddDays(1),//有效时间
signingCredentials //数据前面
);
var tokenJson = new JwtSecurityTokenHandler().WriteToken(token);
//3:OK+ Jwt
return Ok(tokenJson);
}
}
Dto
public class LoginDto
{
[Required]
public string Email { get; set; }
[Required]//说明必填
public string Password { get; set; }
}
在appsettings.json 方法加上:
"Authentication": {
"Issuer": "testesttest.com",
"Audience": "testesttest.com",
"SecretKey": "woxiangceshinizhegejwt",//需要超过16个不然会出错
"ExpiresDays": 7
}
开始测试
成功得到密钥。在jwt.io进行测试密钥
好了,成功得到第一个基于JWT生成的token。开启完美的jwt一段征途吧!