JWT的基本使用

什么是JWT

JWT由三部分组成,头部Header、负载Payload、签名Signature,分别使用'.'分隔开,主要用于认证身份使用。

头部Header

通常用于描述一些的信息,如使用的加密算法。(一般写"alg": "HS256",)

负载Payload

一般用于写传递的数据,如账号这些。

注意:一些安全敏感信息不推荐存放,默认是不会加密的,base64是可以反编译的,相当于明文。

签名Signature

一般由头部Header+'.'+负载Payload+'.'+密钥组成,再经过一些签名算法生成,出于安全,密钥不能给前端。

流程

1、用户在前端请求登录操作等操作时,将请求发送到后端。

2、后端在检验后,向前端发送生成的JWT。

3、后续登录时,前端带保存的JWT请求。

4、后端首先对签名Signature进行验证查看。

5、正确再次验证JWT,正确返回数据。

简单生成一个JWT

在.NET中需要安装一个包System.IdentityModel.Tokens.Jwt

Install-Package System.IdentityModel.Tokens.Jwt

public object NewJwt()
{
    List claims = new List();
    claims.Add(new Claim("password", "123456"));
    claims.Add(new Claim("ID", "00001"));
    string key = "awfasgjiowqpuurio12352opoijaops12";//这里瞎写的密钥
    DateTime expire = DateTime.Now.AddHours(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: expire, signingCredentials: credentials);
    string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
    return jwt;
}

这是生成的一个JWT,可以看到由'.'进行分割,将整体分割为了 头部Header、负载Payload、签名Signature三部分。

为什么不要传输安全类的敏感信息

我们向NewJwts方法中传输我们生成的JWT。

public object NewJwts(string s)
{
    string[] strs = s.Split('.');
    string a = strs[0];
    string b = strs[1];
    string c = strs[2];
    string aa = Jwts(a).ToString();
    string bb = Jwts(b).ToString();
    string cc = Jwts(c).ToString();
    return new { aa, bb, cc };
}
public object Jwts(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);
}

运行我们可以看到我们将负载Payload中传递的一些信息给解析出来了,我们前面压入的password和ID信息出现了,所以传输数据时需要注意。

JWT的基本使用_第1张图片

解JWT

将我们生成的JWT传输到其中进行解析。

public object ReturnJwt(string s)
{
    List b = new List();
    string seckey = "awfasgjiowqpuurio12352opoijaops12";//前面瞎写的那个密钥
    JwtSecurityTokenHandler tokenHandler = new();
    TokenValidationParameters valParam = new();
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(seckey));
    valParam.IssuerSigningKey = securityKey;
    valParam.ValidateIssuer = false;
    valParam.ValidateAudience = false;
    ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(s, valParam, out SecurityToken secToken);
    foreach (var claim in claimsPrincipal.Claims)
    {
        b.Add(claim.Value);
    }
    return b;
}

你可能感兴趣的:(服务器,c#,.net,安全架构,状态模式)