JWT(代替Session会话)

    经典的保持登陆状态的办法是Session,也就是用户登陆后,服务器产生唯一标识SessionId,并把SessionId和登陆的用户信息保存在服务器内存中,通时将SessionId发送给浏览器(浏览器一般是把SessionId保存在Cookie中),当浏览器再次访问的时候,http请求中便携带了SessionId,服务器根据该Id在内存中取到用户信息,这样就实现了登陆功能功能。

     我们在分布式的环境下,还有前后端分离,多客户端时代(多客户端调用同一个Web API后台)的情况下:

Session就有如下的缺点:

1:如果Session保存在内存中,当登陆用户多的时候,会占用服务器大量服务器内存,而且无法支持分布式集群。
2:如果Session保存到Redis等状态服务器中,这样是可以支持分布式集群,但是每一次客户端的请求都要向状态服务器获取一次Session数据(获取SessionId跟用户的关联关系),这会导致请求的响应速度变慢,而且非常浪费服务器的资源。


现在多采用JWT代替Session,JWT使用JSON来保存令牌信息,并不把信息保存在服务端,而是保存在客户端。

JWT的结构包括头部、负载和签名:

1:JWT的头部(hrader):保存的是加密算法的说明
2:负载(payload):保存的是用户的Id,用户名,角色等信息(程序员想保存什么信息就什么信息,不过因为是明文保存,不要保存一些不能让客户端知道的信息)
3:签名(signature):是根据头部和负载还有密钥一起算出来的


JWT的登陆流程:

1:客户端向服务单发送登陆请求
2:服务端检验用户名密码,如果成功将从数据库中提取出这个用户的Id、角色等信息服务端采用3:自定义的秘钥对用户信息(JSON)进行签名,形成签名数据
4:将用户信息(JSON)和上一步形成的签名拼接形成JWT,发送给客户端:
5:客户端每次请求都带上这个JWT
6:每次服务器收到带JWT的请求后,使用自定义的秘钥对JWT的签名进行校验,如果成功则从JWT中取出用户信息

JWT基本使用

1:安装NuGet包

System.IdentityModel.Tokens.Jwt

2:生成JWT(登录成功之后,就去生成JWT)

//每个claim代表一条信息,一个用户可能有多条信息如Id,name,所以这里用列表
var claims = new List<Claim>();
//Claim具有两个属性Type和Value,他们都是string类型、
//Type:用户信息的名字(可以直接ClaimTypes.Name等,也可以直接字符串 “姓名”什么的。
//这里推荐使用ClaimTypes,因为你在生成JWT的时候随便取名,你验证的时候取值的时候就麻烦了)
//Value:用户信息的值
claims.Add(new Claim(ClaimTypes.NameIdentifier, "6"));
claims.Add(new Claim(ClaimTypes.Name, "yzk"));
claims.Add(new Claim(ClaimTypes.Role, "User"));
claims.Add(new Claim(ClaimTypes.Role, "Admin"));//一个Type下允许有多个value
claims.Add(new Claim("PassPort", "E90000082"));
//签名秘钥,自定义,长一些安全
string key = "fasdfad&9045dafz222#fadpio@0232";
DateTime expires = DateTime.Now.AddDays(1);//设置令牌过期时间
byte[] secBytes = Encoding.UTF8.GetBytes(key);
var secKey = new SymmetricSecurityKey(secBytes);
var credentials = new SigningCredentials(secKey,SecurityAlgorithms.HmacSha256Signature);
var tokenDescriptor = new JwtSecurityToken(claims: claims,
    expires: expires, signingCredentials: credentials);

//这里就生成了JWT
string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值