在Asp.Net Core中使用JWT认证(一) - JWT介绍

作者 the7
发布于 2020年01月22日
评论 0
浏览 224
文章系列目录
在Asp.Net Core中使用JWT认证(一) - JWT介绍
在Asp.Net Core中使用JWT认证(二) - .Net Core中使用
在Asp.Net Core中使用JWT认证(三) - RSA非对称加密
在Asp.Net Core中使用JWT认证(四) - 跨语言使用
在Asp.Net Core中使用JWT认证(五) - 结束篇 一些常见问题

JWT,全称Json Web Token,是一个开放标准(RFC 7519),以JSON对象在各方安全地传输信息。通俗来说,JWT是一个含签名并携带用户信息的Base64字符串,服务端在收到JWT串时,会进行验签匹配以保证信息未被篡改,验签通过则为合法身份。

一个JWT看起来大概是这样

由图中可以看到,JWT由红紫蓝三部分构成,并由两个点分隔。红色为header部分,紫色为payload部分,最后蓝色为签名部分,所以这三部分组成就是 header.playload .signature。

header部分指定token的类型和使用的算法(HMAC、SHA256、RSA等)

  • HMAC ,Hash Message Authentication Code 散列消息鉴别码,基于密钥的 Hash算法的认证协议。用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。

  • SHA256,Secure Hash Algorithm,安全散列算法,数字签名等密码学应用中重要的工具,安全性高于MD5。

  • RSA,一种非对称加密算法。

头部组成类似:

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

通过Base64编码得到header部分 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

playload 部分

playload是用来存用户信息(claims)的地方,claims有三种类型: registered、 public、private claims。

  • Registered claims: 这些是一组预定义的claims,非强制性的,但是推荐使用, iss(发行人), exp(到期时间), sub(主题), aud(观众)等;

  • Public claims: 自定义claims,注意不要和JWT注册表中属性冲突,这里可以查看JWT注册表

  • Private claims: 这些是自定义的claims,用于在同意使用这些claims的各方之间共享信息,它们既不是Registered claims,也不是Public claims。

常用claims

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token。

一个playload如

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": "1516239022"
}

通过Base64编码上边JSON得到playload部分eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

签名部分

签名部分是由前两部分加securityKey组成。

var hs256 = new HMACSHA256(Encoding.ASCII.GetBytes(securityKey));
var encodedSignature = Base64UrlEncoder.Encode(hs256.ComputeHash(Encoding.UTF8.GetBytes(string.Concat(encodedHeader, ".", encodedPayload))));

这三部分组在一起,就得到了最上边图中的Token字符串。

从JWT原理我们知道这些都是Base64字符串,所以,千万不要把敏感信息存入JWT

4条评论

  • 念往昔丶繁华竞逐

    2019年5月20日

    最后一个五官很漂亮,虽然脸稍微大了一点点,但也算普通人里漂亮的
  • Eleven

    2019年5月20日

    念往昔丶繁华竞逐:
    最后一个五官很漂亮,虽然脸稍微大了一点点,但也算普通人里漂亮的...
    这帖子真的是精品。美中不足的是,为什么要用繁体,虽然能看懂,但有些麻烦呀。
  • SukiU

    2019年5月20日

    我曾在某外企互联网公司工作过一段时间,他们就是那种工作时间聊天摸鱼,下班时间拼命工作,然后加班蹭加班费和补贴😂
微信公众号
站长帮
微信公众号,每日更新!