-
头部(Header):包含了令牌的元数据信息,如令牌类型(JWT)、签名算法(HS256、RS256等)等,头部通常采用JSON格式表示,并进行Base64编码 -
载荷(Payload):包含了实际的数据信息,如用户ID、角色、权限等,载荷也是采用JSON格式表示,并进行Base64编码 -
签名(Signature):由头部、载荷和一个密钥(或公钥)经过指定的算法计算得到,用于验证JWT的完整性和真实性
新建一个项目命名为AspNetCore.API.JWT.Authentication,我们先做一个简单的用户注册,然后再用已经注册的用户来登录,最后拿着发行的token看是否能验证成功
1. 注册用户
为了方便我们直接将用户保存在内存中,创建一个UserController的控制器,添加一个Post方法用来新增用户,Post方法的参数为UserDTO,主要用来为用户输入信息,用户名和密码
方法的返回值为User,我们存储用户的密码需要加密,我们对密码做hash处理,并将hash值和salt返回给用户,简单一个注册就完成,代码如下所示:
2. 用户登录
由于我们将用户密码进行Hash处理,所以密码只有用户本人知道,我们只能将用户输入的密码和内存中存储的hash进行比较,如果相等的话,说明密码是正确的,否则密码错误,正确之后颁发token,生成token的代码如下:
声明Claim用户存储用户信息,使用SymmetricSecurityKey创建一个秘钥,接着使用秘钥来创建签名的凭证,最后生成token,再将这个token输出到客户端
3. 验证Token
接下来我们用这个token来验证我们的api,在没有输入之前我们调用api,发现401未授权:
源代码地址:
https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/Fundamentals/AspNetCore.API.Auth/AspNetCore.API.JWT.Authentication
评论0