文章目录
Jwt简单介绍
什么是Jwt
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
以上内容来自下面这位大佬的简书,强烈推荐各位小伙伴去拜读一下。
作者:Dearmadman
链接:https://www.jianshu.com/p/576dbf44b2ae
Jwt由3个信息段构成,分别是:头部(Header),载荷(Payload),签证信息(signature)。以上三个部分通过头部中声明的加密算法加密并以’.'连接就成了Jwt字符串。
头部保存的是声明信息,声明这是Jwt和声明加密算法。
载荷保存的是我们服务器给这个用户的信息,一般是分配一个Guid特定识别这个用户以及这个Token的有效期信息。
签证信息保存的是与加密算法相关的信息,在 ASP.Net Core中这些信息可以调用现成的方法直接生成。
Jwt安全吗
首先,从服务器的角度看,Jwt是服务器自己做出来的,用于特定识别某个用户的登录令牌,也就是说不管是谁,只要能截取到这个登录令牌就能伪造请求。
从客户端的角度来说,这个登录令牌只是一段字符串,在请求非公共接口时在Http请求的Header中带上就完事了,也不用去解析获取令牌里面的载荷信息。除非客户端也有Jwt中的签证信息,也能自己生成一个合法的令牌,不过在客户端中保存签证信息太危险了。
那么,我们能截取到这个登录令牌吗?如果是http请求的话,是能轻易抓取到的,但如果是https请求的话就不简单了,因为https的加密范围是包含请求的Header和Body,只要你不是通过url的形式传递令牌就能被加密到。所以Jwt还是应该配合https一起使用,不过这些都是防君子不防小人,任何东西在网络上传输都不能做到绝对安全。
在 ASP.NET Core中使用Jwt
授权和认证
在上代码之前,有一些概念必须要理解清楚。授权(Authorization)和认证(Authentication)的概念一定要明白。这两个东西都是Auth开头,tion结尾,不仔细看还真挺难区分。
首先,在访问非公开接口前先要经过认证,然后要验证授权。举个例子,认证就好比是登录游戏,但是在游戏里能不能使用VIP特权就要经过授权验证。认证(Authentication)只是说明你是合法用户,但不是每个用户都有权限执行这个操作,这就需要授权(Authorization)。
对于非公共接口,一定要有认证,但不一定要有授权(没有VIP的玩家总不能连刷图都不让吧?)。
三步走代码例子
在 ASP.Net Core 2.2中使用Jwt认证分三步走。
如果不需要自定义授权认证可以忽略第二步。
生成Jwt
首先,我们需要编辑一个登录接口,用户登录成功后就给他一个Jwt令牌,以后访问所有非公共接口都通过这个令牌识别该用户。令牌中包含一个Guid,登录成功后将该Guid和用户信息关联记录起来,后续操作根据Guid获取该用户信息。
[HttpPost("login")]
public IActionResult Login([FromBody]Client user)
{
IActionResult ret = null; // 用户登录验证
if(CheckUser(user))
{
// 验证通过,生成唯一识别码放到Token的Payload(载荷)里面
string guid