十、JWT介绍
JWT只是缩写,全称则是JSON Web Tokens,是目前流行的跨域认证解决方案,是基于开放标准RFC7519,提供一种身份认证与信息交换的解决方案,是一种基于JSON的用于在网络上声明某种主张的令牌(token)。
由于http的连接是状态的特性,server端和client是不会记住每个请求是谁发过来的,也不会知道当前发送请求的用户是否已经对过身份认证,如果用户的每一个请求,都要与数据库通讯进行身份认证,会增加server和数据库的成本。因此,之前的Web应用一般都会用session或 cookie的方式解決。
- 用户第一次登录时,后端核对用户名和密码,进行身份认证。
- 后端将jwt token字符串作为登录成功的结果返回给client端,client端将返回结果记录在storage中。
- 用户再次发起请求时,每次请求都要在请求头中携带这个jwt token,server端在收到这个token之后,进行验证,验证通过,从jwt中读取用户信息,并执行后续操作;验证不能过,返回错误信息。
- 退出登录时删除保存的JWT Token即可。
JWT 结构
一个token分为3部分:头部(header、载荷(payload、签名(signature
2.载荷(payload,有效载荷部分,是JWT的主体内容部分,是承载消息具体内容的地方,也是一个JSON对象,包含需要传递的数据,需要使用Base64编码。 JWT指定七个默认字段供选择
sub(subject: jwt所面向的用户
aud(audience: 接收jwt的一方, 受众
exp(expiration time: jwt的过期时间,这个过期时间必须要大于签发时间
nbf(Not Before: 生效时间,定义在什么时间之前.
iat(Issued At: jwt的签发时间
jti(JWT ID: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
3.签名(signature,签名哈希部分是对上面两部分数据签名,需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名
header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法,从payload中获取有效数据
注意:secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值
关于jwt更多信息,可参考jwt.io的说明。
十一、创建JWT服务
- 在Visual Studio 2022的解决方案资源管理器中,使用鼠标右键点击“依赖项”,从弹出菜单中选择“管理NuGet程度包”菜单项,或是“工具—》NuGet包管理器器—>管理解决方案的NuGet程序包”菜单。如下图。
2. 在搜索输入框中输入“JWT”,然后安装JWT程序包,如下图。
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer -Version 6.0.11
4. 在Visual Studio 2022中打开appsettings.json文件,在此配置文件中添加JWT的配置,参考代码如下,注意SecretKey不能设置成太短的纯数字,不然要报错。
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "ConnectionStrings": { "BookContext": "Server=.;Database=LeaseBooks;Trusted_Connection=True;MultipleActiveResultSets=true" }, "AllowedHosts": "*", "Authentication": { "SecretKey": "Blazor!SecKey@webdemo@vvip.GHTUPAVX", "Issuer": "JWT.Reg22user@Isskl35", "Expires": 10, "Audience": "login.Blazor.audit" } }
Issuer,注册人
Audience,访问人
Expires,到期时间