当前位置: 首页 > news >正文

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

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

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

环境

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

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

配置信息的存储

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

  "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; }
    }

注入

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

想必这里的代码大家肯定是看的轻车熟路了,非常的简单。
接下来我们对Jwt的签发制作一个JwtHelper类。

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<IGetInfoFromToken, GetInfoFromToken>();
自己创建号这两个接口和类,对httpcontext进行截断,从httpcontext.user中就可以直接取出我们需要的payload。当然也可以使用中间件的方式,这里我们就不再用篇幅进行叙述了。

如果我的文章帮到了你,请帮忙点个赞,点个关注。谢谢!

我的掘金:WarrenRyan

我的简书:WarrenRyan

欢迎关注我的博客获得第一时间更新 https://blog.tity.online

我的Github:StevenEco

我的博客园:WarrenRyan

转载于:https://www.cnblogs.com/WarrenRyan/p/10551630.html

相关文章:

  • javascript面向对象编程,带你认识封装、继承和多态
  • 【SQL优化】MySQL官网中可优化的层次结构
  • 1.2变量
  • Kubernetes 笔记 06 豌豆荚之旅(一)
  • 2019.3.19
  • JPA将查询结果转换为DTO对象
  • CTF-rootme 题解之PHP filters
  • 微信小程序之文本输出
  • 优秀前端工程师必备: cookie的增删改查Demo!
  • 关于博客园首页
  • 细说并发编程-TPL
  • 关于lua性能
  • 动态规划--新手
  • 树的子结构
  • myssql数据库表名转驼峰 - PLAY - ITeye博客
  • [PHP内核探索]PHP中的哈希表
  • ES6指北【2】—— 箭头函数
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CSS实用技巧
  • js数组之filter
  • PV统计优化设计
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 分类模型——Logistics Regression
  • 入门到放弃node系列之Hello Word篇
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 用 Swift 编写面向协议的视图
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #include到底该写在哪
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (LeetCode 49)Anagrams
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (二)c52学习之旅-简单了解单片机
  • (附源码)php投票系统 毕业设计 121500
  • (转)C#调用WebService 基础
  • ***原理与防范
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net core 6 集成和使用 mongodb
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • ?php echo ?,?php echo Hello world!;?
  • @Bean有哪些属性
  • [.NET]桃源网络硬盘 v7.4
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [20150904]exp slow.txt
  • [Angular] 笔记 18:Angular Router
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [codeforces] 25E Test || hash
  • [FT]chatglm2微调
  • [js]- 两个对象的合并(Object.assign)
  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用
  • [LeetCode]-Integer to Roman 阿拉伯数字转罗马数字
  • [Nuget]使用Nuget管理工具包