ASP.NET Core 基于JWT的认证(二)

ASP.NET Core 基于JWT的认证(二)

上一节咱们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节咱们将详细的讲解,本次咱们将详细的介绍一下 Jwt.Net Core 上的实际运用。html

环境

  • .Net Core 2.2
  • Visual Studio 2017
  • ASP.NET Core WebAPI2

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

配置信息的存储

一般来讲,咱们会把数据库等等一系列的配置放在咱们的appsettings.json中,咱们也尝试着将咱们的jwt私钥等存在其中。github

"JwtSettings": {
    "Issuer": "admin",
    "Audience": "user",
    "SecretKey": "ahfuawivb754huab21n5n1"
  }

固然你也能够把更多的配置放进去。
而后咱们用依赖注入的方法,将配置文件注入到咱们的类对象中。咱们建立一个JwtSetting类,而且在服务中进行注入。
类对象数据库

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

        /// <summary>
        /// 容许使用的角色
        /// </summary>
        public string Audience { get; set; }

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

注入json

services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
            JwtSettings setting = new JwtSettings();
            Configuration.Bind("JwtSettings", setting);
            JwtHelper.Settings = setting;

想必这里的代码你们确定是看的轻车熟路了,很是的简单。
接下来咱们对Jwt的签发制做一个JwtHelper类。c#

Jwt的签发

这一块,你能够上网去查看权限模型的一些介绍。app

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

ClaimsIdentity就是用于指明Claim中所存储的内容的合集,好比咱们的身份证,年龄、性别、身份证号码等就组成了咱们的身份证。ide

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<IGetInfoFromToken, GetInfoFromToken>();
本身建立号这两个接口和类,对httpcontext进行截断,从httpcontext.user中就能够直接取出咱们须要的payload。固然也可使用中间件的方式,这里咱们就再也不用篇幅进行叙述了。

若是个人文章帮到了你,请帮忙点个赞,点个关注。谢谢!

个人掘金:WarrenRyan

个人简书:WarrenRyan

欢迎关注个人博客得到第一时间更新 https://blog.tity.online

个人Github:StevenEco

个人博客园:WarrenRyan

相关文章
相关标签/搜索