- 服务器接收用户请求发送的用户名和密码
- 服务器验证通过后,在当前对话(session)里面保存相关数据
- 服务器返回一个 session_id,写入用户的 Cookie
- 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器,服务器通过 session_id,找到前期保存的数据,从而得知用户的身份
传统验证方法如果是面对服务器集群就要求 session 数据共享,每台服务器都能够读取 session。但如果session存储的节点挂了怎么办?
这时,Token验证方式就应运而生了
1.通过Nuget安装 Microsoft.AspNetCore.Authentication.JwtBearer
(注意V6.0.0对应.net 6,.net5只需要安装V5版本即可)
2.配置JWT配置文件
创建JWTTokenOptions类
3.注册中间件
4.根据用户名和密码生成Token
public string GetToken(string UserName, string password, User user)
{
var claims = new[]
{
new Claim("username", user.username),
new Claim("id", user.id.ToString())
};
//需要加密:需要加密key:
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_JWTTokenOptions.SecurityKey));
SigningCredentials creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
JwtSecurityToken token = new JwtSecurityToken(
issuer: _JWTTokenOptions.Issuer,
audience: _JWTTokenOptions.Audience,
claims: claims,
expires: DateTime.Now.AddMinutes(5),
signingCredentials: creds);
string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
return returnToken;
}
返回Token
public JsonResult Accredit([FromForm] string username, [FromForm] string password)
{
AjaxResult ajaxResult = _HttpHelperService.VerifyUser(username, password);
if (ajaxResult.Result)
{
string token = this._iJWTService.GetToken(username, password, ajaxResult.TValue);
ajaxResult.Value = token;
}
Console.WriteLine($"Accredit Result : {JsonConvert.SerializeObject(ajaxResult)}");
return new JsonResult(ajaxResult);
}
拿到Token,就可以返回到前端存到本地缓存了
经过以上几步,初步实现了JWT认证的功能,这个地方我们还可以采用黑名单机制(Redis)这里就不过多讨论了- 在退出登录的时候将相应Token加入黑名单;
- 修改人员的时候记录人员和时间,将当时间之前的所有Token判定为无效
- 每次请求都通过Redis黑名单验证Token的有效性。



