discuz修改网站关键词,上海抓捕236名,freenom怎么做网站,塑胶原料东莞网站建设目录
Session的缺点
JWT#xff08;Json Web Token#xff09;
优点#xff1a;
登录流程
JWT的基本使用
生成JWT
解码JWT
用JwtSecurityTokenHandler对JWT解码
注意 Session的缺点
对于分布式集群环境#xff0c;Session数据保存在服务器内存中就不合适了#…目录
Session的缺点
JWTJson Web Token
优点
登录流程
JWT的基本使用
生成JWT
解码JWT
用JwtSecurityTokenHandler对JWT解码
注意 Session的缺点
对于分布式集群环境Session数据保存在服务器内存中就不合适了应该放到一个中心状态服务器上。ASP.NET Core支持Session采用Redis、Memcached。中心状态服务器有性能问题。
JWTJson Web Token
JWT把登录信息也称作令牌保存在客户端。为了防止客户端的数据造假保存在客户端的令牌经过了签名处理而签名的密钥只有服务器端才知道每次服务器端收到客户端提交过来的令牌的时候都要检查一下签名。
优点
状态保存在客户端适合分布式系统。签名保证了客户端无法数据造假。性能更高不需要和中心状态服务器通讯纯内存计算。 登录流程
客户端向服务器端发送用户名密码等请求登录。服务器端校验用户名密码如果校验成功则从数据库中取出这个用户的ID、角色等用户相关信息。服务器端采用只有服务器端才知道的密钥来对用户信息的JSON字符串进行签名形成签名数据。服务器端把用户信息的JSON字符串和签名拼接到一起形成JWT然后发送给客户端。客户端保存服务器端返回的JWT并且在客户端每次向服务器端发送请求的时候都带上这个JWT。每次服务器端收到浏览器请求中携带的JWT后服务器端用密钥对JWT的签名进行校验如果校验成功服务器端则从JWT中的JSON字符串中读取用户的信息。这样服务器端就知道这个请求对应的用户了。
JWT的基本使用
NuGetSystem.IdentityModel.Tokens.Jwt
生成JWT
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;//claim是一个键值对用来存储用户信息比如用户id用户名角色等
var claims new ListClaim()
{new Claim(ClaimTypes.NameIdentifier, 123),new Claim(ClaimTypes.Name, ljy),new Claim(ClaimTypes.Role, admin),new Claim(ClaimTypes.Role, user),new Claim(Passport, E90000082),new Claim(Id, E90000082)
};
string key jddsjf54$$%45445%^$gvdfgd8d454dgji34jk;
//设置过期时间30分钟后过期
DateTime expires DateTime.Now.AddMinutes(30);
byte[] keyBytes Encoding.UTF8.GetBytes(key);
//对称秘钥
var secKey new SymmetricSecurityKey(keyBytes);
//签名凭据
var credentials new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256Signature);
//创建jwtSecurityToken
var tokenDescriptor new JwtSecurityToken(claims: claims,//声明expires: expires,//过期时间signingCredentials: credentials//签名凭据);
//生成token
string jwt new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
Console.WriteLine(jwt);
解码JWT
using System.Text;string jwt eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjEyMyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJsankiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiYWRtaW4iLCJ1c2VyIl0sIlBhc3Nwb3J0IjoiRTkwMDAwMDgyIiwiSWQiOiJFOTAwMDAwODIiLCJleHAiOjE3Mzg4MzAxMTB9.frI1BwyedlIfuIcWgkxfNsbXkaJJ01M3iNo7wXt6Fy8;string[] strs jwt.Split(.);
string header JwtDecode(strs[0]);
string payload JwtDecode(strs[1]);
Console.WriteLine(---head---);
Console.WriteLine(header);
Console.WriteLine(---payload---);
Console.WriteLine(payload);string JwtDecode(string s)
{s s.Replace(-, ).Replace(_, /);switch (s.Length % 4){case 2:s ;break;case 3:s ;break;}var bytes Convert.FromBase64String(s);return Encoding.UTF8.GetString(bytes);
}
用JwtSecurityTokenHandler对JWT解码
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;string jwt eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjEyMyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJsankiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiYWRtaW4iLCJ1c2VyIl0sIlBhc3Nwb3J0IjoiRTkwMDAwMDgyIiwiSWQiOiJFOTAwMDAwODIiLCJleHAiOjE3Mzg4MzAxMTB9.frI1BwyedlIfuIcWgkxfNsbXkaJJ01M3iNo7wXt6Fy8;string secKey jddsjf54$$%45445%^$gvdfgd8d454dgji34jk;
JwtSecurityTokenHandler tokenHandler new();
//设置验证参数
TokenValidationParameters valParam new();
SymmetricSecurityKey securityKey new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secKey));
//获取或设置用于签名验证的 SecurityKey
valParam.IssuerSigningKey securityKey;
//不验证发行者
valParam.ValidateIssuer false;
//不验证接受者
valParam.ValidateAudience false;
ClaimsPrincipal claimsPrincipal tokenHandler.ValidateToken(jwt,valParam, out SecurityToken secToken);
foreach (Claim claim in claimsPrincipal.Claims)
{Console.WriteLine(${claim.Type}{claim.Value});
}注意
负载中的内容是明文形式保存的 不要把不能被客户端知道的信息放到JWT中