.Net Core之JWT授权

163 阅读3分钟

JWT介绍

JWT,全称是JSON WEB TOKEN , 属于一个规范,它定义了一种简洁的、自身包含协议的格式,用于在通信双方传递json对象,适合使用在分布式站点的单点登录(SSO)场景。

JWT优点

  • 基于json,方便解析。
  • 在令牌中自定义内容,方便拓展。
  • 安全性高
  • 资源服务可以不依赖认证服务就能完成授权。

JWT缺点

字符串过长,占用存储空间过大。 由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据

使用场景

应用最多的场景是登录授权,相比原先的session、cookie来说,更快更安全,跨域也不再是问题,并且支持移动端,一旦用户登录,后续每个请求都将包括JWT,从而允许用户访问该令牌允许的路由、服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。

JWT令牌是一大串不可读的字符,其中包含的信息已隐藏和编码,被签名或加密算法覆盖。它由三部分组成:头部(Header)、主体(Payload)和签名(Signature),实际上是一个字符串,以.符号分隔开:Header.Body.Signature。

//类似这种
xxx.yyy.zzz

头部Header

header包含token的元数据,主要是加密算法和签名的类型,如下面的信息,说明了加密的对象类型是JWT,加密算法是HMAC SHA-256。 image.png

主体Payload

payload主要包含一些声明信息,这些声明是key-value的数据类型。通常如用户名、角色、有效期、颁发者、接受者、过期日期等,因为是未加密的,因此不建议存放敏感信息,同时通过Base64编码后存入token中。 JWT规定了7个官方字段,如下所示:

  • iss:JWT的签发人
  • exp:JWT的过期时间
  • sub:JWT所面向的用户
  • aud:JWT的接收方
  • nbf:JWT的生效时间
  • iat:JWT的签发时间
  • jti:JWT的编号

签名Signature

signature要符合jws(Json Web Sianature)的标准生成一个最终的签名。把编码后的Header和Payload信息加在一起,然后使用一个强加密算法,如 HmacSHA256,进行加密。在拿到签名数据之后,把这三个部分的数据拼接起来,每个部分中间使用.来分隔,JWT Token就生成了,接下来返回给客户端。而客户端每次请求时,都必须携带JWT Token在请求头中,服务器通过解密的方式判断对应的用户信息。

.NET中具体实现

1,nuget安装Microsoft.AspNetCore.Authentication.JwtBearer

image.png

2,创建jwt配置类

image.png

3,在 appsettings.json 增加jwt使用到的配置信息

image.png

4,在startup类的ConfigureServices方法中增加读取配置信息,注入JWT身份认证服务

image.png

image.png

5,生成用户token代码块

生成token的同时会给出当前token的失效时长、当前token过期后的刷新令牌token、刷新令牌失效时长等。每个token一旦生成,是有一定的失效时长,当前token若过期失效了,则可以通过刷新token来重新生成一个新的token。若刷新token也过期了,则让当前用户重新登录。 image.png

image.png