首页 学海无涯 WebAPI .NET Core WebAPI 认证授权之JWT(一):JWT介绍
.NET Core WebAPI 认证授权之JWT(一):JWT介绍
摘要 介绍JWT结构,认证授权流程、签名算法等

开发环境

VisualStudio 2019 16.8.3

ASP.NET Core 5.0  

正文

一、什么是JWT

JWT是JSON Web Token的缩写,JSON Web Token是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,可以将各方之间的信息作为JSON对象安全地传输。该信息可以被验证和信任,因为它是经过加密的。

二、JWT结构


Token原文

Token由三部分组成,通过"."分隔,分别是:

    ● 标头

    ● 有效载荷

    ● 签名

所以JWT表示为:xxxxx.yyyyy.zzzzz

1.标头

标头通常由两部分组成:令牌的类型(JWT)和所使用的签名算法(HMAC SHA256或RSA)。

{
  "alg": "HS256",
  "typ": "JWT"
}

然后此JSON被Base64Url编码以形成JWT的第一部分

2.有效载荷

有效负载中包含声明。声明是有关实体(通常是用户)和其他数据的声明,用来传递数据。

官方规定了7个非强制但建议使用的字段:

●  iss(issuer):签发人

●  exp(expiration time) :过期时间

●  sub(subject):主题

●  aud(audience):受众

●  nbf(not befaore):生效时间

●  lat(issued at):签发时间

●  jti(jwt id):编号

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

然后对此JSON进行Base64Url编码形成JWT的第二部分

3.签名

签名是将第一部分(header)、第二部分(payload)、密钥(key)通过指定算法(HMAC、RSA)进行加密生成的。

例如,如果要使用HMAC SHA256(HS256)算法,则将通过以下方式创建签名:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

生成的签名就是JWT的第三部分

将这三部分拼接在一起并使用"."分隔后形成的字符串就是Token。如:


最后可以使用jwt.io Debugger解码,验证或生成JWT。

注意:虽然签名过后的Token可以防止篡改,但是Token的信息是公开的,任何人都可以读取,所以尽量不要在有效载荷或标头传递敏感信息(如密码)。

三、JWT认证授权流程


偷了张图    

认证授权流程客户端使用账号和密码访问鉴权中心进行认证 =》鉴权中心验证账号密码,正确则生成并返回Token =》客户端使用Token访问API =》API验证Token,有效则返回数据。

该流程中有基本的三个对象:鉴权中心API 客户端,是三个独立的模块。

在这个过程中,有两点需要注意:

1.Token安全问题?

由于Token是访问数据的凭证,所以需要格外注意Token安全问题。首先不应该将Token保存太久,会设置一个过期时间。其次,在使用浏览器请求时,切勿将Token放在浏览器本地存储(local-storage)中。每当用户想要访问受保护的资源时,用户都应该带上Token,通常会放在Authorization请求标头中,如下:

Authorization: Bearer <token>

2.API如何验证客户端携带的Token是否有效?

这里就用到了签名,也就Token的第三部分,JWT有两种常见的签名算法:HMACRSA

HMAC全称哈希消息认证码,是一种具有密钥的哈希算法,以一个密钥和一个消息为输入,生成消息摘要作为输出。

    鉴权中心:key1

    API:key1

双方持有相同的 key1  ,鉴权中心验证账号密码成功后,使用 key1  进行HMAC加密后得到Token并返回给客户端,客户端使用该Token访问API时,API使用 key1  进行解密,如果能够解密,则说明Token是来自鉴权中心,进一步验证Token是否过期,没过期则返回数据。

RSA是一种非对称可逆加密,具有一对不同的密钥(公钥和私钥),如果使用公钥加密,那么只有私钥能解密,如果使用私钥加密,则只有公钥能解密。

    鉴权中心:private_key

    API:public_key

首先借助第三方工具,生成一对RSA密钥( private_key  和 public_key  ),然后将 private_key  给鉴权中心,将 public_key  给API。

鉴权中心验证账号密码成功后,使用 private_key  进行RSA加密后得到Token并返回给客户端,客户端使用该Token访问API时,API使用 public_key  进行解密,如果能够解密,则说明Token是来自鉴权中心,进一步验证Token是否过期,没过期则返回数据。

四、JWT对比传统认证授权模式(Session、Cookies)的优劣势

1.减轻服务器压力

Token自身包含了信息,并且不需要将Token存储在服务器,可以有效减轻服务器压力。

2.可以多端使用

可以将Token用于移动端、小程序、桌面程序等,打破了传统模式只能用于浏览器的局限性。

3.单点登录友好

没有跨域问题,轻松实现单点登录。

感谢阅读,敬请斧正。

附录一:RSA密钥对生成工具安装包  

附录二:系列Demo(弄丢了,卧槽)

附录三:系列目录

            《.NET Core WebAPI 认证授权之JWT(一):JWT介绍》

            《.NET Core WebAPI 认证授权之JWT(二):HMAC算法实操》

            《.NET Core WebAPI 认证授权之JWT(三):RSA算法实操》

            《.NET Core WebAPI 认证授权之JWT(四):JWT续期问题》  


版权声明:本文由不落阁原创出品,转载请注明出处!

本文链接:http://www.leo96.com/article/detail/55

广告位

来说两句吧
最新评论

暂无评论,大侠不妨来一发?