在上一篇文章中,我们详细的介绍了JWT的知识,这一次,我们将进行一次实战的训练,这一块将会有三个部分组成。分别是:
1.如何使用微软官方提供的库实现jwt
2.如何自定义一个Jwt认证类
3.使用非关系型数据库Redis对jwt信息的更新和替换
当然,我在后期的文章中也会讲解如何使用IdentityServer4去进行我们的权限控制。
在本文中,你将会学到如何使用微软官方提供的库进行Jwt的签发、验证以及权限控制。我们使用的WebApi作为演示程序。www.zztjyy.com

配置信息的存储
通常来说,我们会把数据库等等一系列的配置放在我们的appsettings.json中,我们也尝试着将我们的jwt私钥等存在其中。

"JwtSettings": {
"Issuer": "admin",
"Audience": "user",
"SecretKey": "ahfuawivb754huab21n5n1"
}
当然你也可以把更多的配置放进去。
然后我们用依赖注入的方法,将配置文件注入到我们的类对象中。我们创建一个JwtSetting类,并且在服务中进行注入。
类对象

public class JwtSettings
{
    /// 
    /// 证书颁发者
    /// 
    public string Issuer { get; set; }

    /// 
    /// 允许使用的角色
    /// 
    public string Audience { get; set; }

    /// 
    /// 加密字符串
    /// 
    public string SecretKey { get; set; }
}

注入

services.Configure(Configuration.GetSection("JwtSettings"));
JwtSettings setting = new JwtSettings();
Configuration.Bind("JwtSettings", setting);
JwtHelper.Settings = setting;
想必这里的代码大家肯定是看的轻车熟路了,非常的简单。
接下来我们对Jwt的签发制作一个JwtHelper类。www.zztjyiyuan.com

Jwt的签发
这一块,你可以上网去查看权限模型的一些介绍。

这里我简要的做一个介绍:
Claim是什么呢,他就是一个用于描述一个具体的实体对象的一些描述性的字段。

ClaimsIdentity就是用于指明Claim中所存储的内容的合集,比如我们的×××,年龄、性别、×××号码等就组成了我们的×××。

ClaimsPrincipal我们称为“证件当事人”,也就是我们之前声明的东西的一个合计,类似,比如说你可能有驾照、×××、医保卡等等,而所持有这些的人就叫做ClaimsPrincipal

一些代码是一个普通的结构,大家可以按照这种模板进行修改模型,从而创建自己的jwt结构

代码:

public class JwtHelper
{
    private static JwtSettings settings;
    public static JwtSettings Settings { set { settings = value; } }
    public static string create_Token(TokenPayload user)
    {
        //这里就是声明我们的claim
        var claims = new Claim[] {
                    new Claim(ClaimTypes.Name, user.Name),
                    new Claim(ClaimTypes.Role, user.Role),
                    new Claim(ClaimTypes.Sid,user.Sid.ToString())
                };
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.SecretKey));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
            issuer: settings.Issuer,
            audience: settings.Audience,
            claims: claims,
            expires: DateTime.Now.AddDays(1),
            signingCredentials: creds);
        var Token = new JwtSecurityTokenHandler().WriteToken(token);
        return Token;
    }
}

JWT认证
在这里,你可以使用我们下一节所遇到的自定义认证,不过我们还是先学着使用我们最为普通的官方方法。具体的操作非常简单,只需要在我们的容器service中注入一下就可以了。

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(config =>
        {
            config.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,//是否验证Issuer
                ValidateAudience = true,//是否验证Audience
                ValidateLifetime = true,//是否验证失效时间
                ValidateIssuerSigningKey = true,//是否验证SecurityKey
                ValidAudience = setting.Audience,//Audience
                ValidIssuer = setting.Issuer,//Issuer,这两项和前面签发jwt的设置一致
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey))//拿到SecurityKey
            };
        });

这样,就完成了我们的jwt认证过程。
如果我们需要从token中取出我们的信息也非常的简单,利用依赖注入,使用
C# services.AddTransient();
自己创建号这两个接口和类,对httpcontext进行截断,从httpcontext.user中就可以直接取出我们需要的payload。当然也可以使用中间件的方式,这里我们就不再用篇幅进行叙述了。