C# JWT权限验证的实现

作者:幸福简单2020 时间:2022-11-24 00:57:13 

什么是JWT,它是一种对API的保护方案,为什么要进行保护呢

  • 防泄漏:你肯定不希望你的数据能被别人随意调用,比如公司的机密信息,不可能每个人都可以访问到

  • 防攻击:防止被人伪装恶意调用接口,利用网关就把请求拦截在外面,防止对服务器造成资源压力

  • 防止被人篡改,导致请求不到信息,防重放攻击(案例:在公共网络环境中,请求被截获,稍后被重放或多次重放)

设计原则

  • 轻量级

  • 易于开发、测试和部署

  • 适合于异构系统(跨操作系统、多语言简易实现)

  • 所有写操作接口(增、删、改 操作)

  • 非公开的读接口(如:涉密/敏感/隐私 等)

第一步:创建token

/// <summary>
        /// 创建token
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CreateJWT1()
        {
            //创建声明Token数组
            var claim = new Claim[]
                {
                new Claim("userid","123"),
                new Claim("userCode","kevinMa"),
                new Claim("projectID","62"),
                new Claim("isValid","1"),
                new Claim("userName","马鹏"),
                new Claim("address","深圳"),
                new Claim("datetime",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
                new Claim("expires",DateTime.Now.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss")),
                };

            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yanglingcong@qq.com"));//密钥大小要超过128bt,最少要16位

            //实例化一个token对象
            //第一种方式
            //var token = new JwtSecurityToken(claims: claim);

            //第二种方式
            var token = new JwtSecurityToken(
                issuer: "kevin",//发起人:当前项目
                audience: "kevin project",//订阅:我们需要谁去使用这个Token
                claims: claim,//声明的数组
                expires: DateTime.Now.AddHours(1),//当前时间加一小时,一小时后过期
                signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)//数字签名 第一部分是密钥,第二部分是加密方式
                );

            //生成token
            var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
            return ToSuccessJson(new { token = jwtToken });
        }

第二步:解析token

/// <summary>
        /// 解析token
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult JXToken(string token)
        {
            
            //第一种直接用JwtSecurityTokenHandler提供的read方法
            var jwtHander = new JwtSecurityTokenHandler();
            JwtSecurityToken jwtSecurityToken = jwtHander.ReadJwtToken(token);
            
            GetTokenModel tokenModel = new GetTokenModel();
            var currentInfo = jwtSecurityToken.Claims;
            if (currentInfo.Count() > 0)
            {
                tokenModel.userid = currentInfo.FirstOrDefault(f => f.Type == "userid").Value;
                tokenModel.userCode = currentInfo.FirstOrDefault(f => f.Type == "userCode").Value;
                tokenModel.projectID = currentInfo.FirstOrDefault(f => f.Type == "projectID").Value;
                tokenModel.userName = currentInfo.FirstOrDefault(f => f.Type == "userName").Value;
                tokenModel.address = currentInfo.FirstOrDefault(f => f.Type == "address").Value;
                tokenModel.datetime = currentInfo.FirstOrDefault(f => f.Type == "datetime").Value;
                tokenModel.expires = currentInfo.FirstOrDefault(f => f.Type == "expires").Value;
            }
            return ToSuccessJson(new { tokenModel });
        }

来源:https://blog.csdn.net/weixin_46942018/article/details/122302408

标签:C#,JWT,权限验证
0
投稿

猜你喜欢

  • C#线程同步的几种方法总结

    2022-01-31 19:49:06
  • flutter 屏幕尺寸适配和字体大小适配的实现

    2022-06-10 06:54:49
  • Android中通过Notification&NotificationManager实现消息通知

    2023-01-01 16:57:05
  • RocketMQ4.5.X 实现修改生产者消费者日志保存路径

    2021-05-24 23:58:37
  • java利用jacob将word转pdf

    2023-02-05 08:23:03
  • MyBatis逆向工程的创建和使用

    2022-07-18 20:07:55
  • Android自定义View实现通讯录字母索引(仿微信通讯录)

    2023-05-14 04:34:22
  • 通俗讲解JVM的类加载机制

    2023-01-03 03:35:03
  • Java 数据结构与算法系列精讲之字符串暴力匹配

    2021-10-06 05:43:27
  • C#函数式编程中的标准高阶函数详解

    2021-06-09 06:27:07
  • java反射之Method的invoke方法实现教程详解

    2023-07-09 20:24:36
  • SpringCloud微服务架构升级汇总

    2022-05-04 06:09:19
  • Spring+SpringMVC+MyBatis深入学习及搭建(二)之MyBatis原始Dao开发和mapper代理开发

    2021-07-24 06:36:00
  • Spring中的两种代理JDK和CGLIB的区别浅谈

    2023-01-04 19:05:05
  • JVM内存增强之逃逸分析

    2022-01-23 00:22:08
  • OpenCV实现直线检测并消除

    2023-07-12 20:44:36
  • java多线程加锁以及Condition类的使用实例解析

    2023-08-07 07:25:30
  • 简单总结C++中指针常量与常量指针的区别

    2022-06-28 17:33:12
  • java并发编程专题(四)----浅谈(JUC)Lock锁

    2021-11-30 00:20:23
  • 如何使用LinQ To Object把数组或DataTable中的数据进行向上汇总

    2022-04-05 17:07:33
  • asp之家 软件编程 m.aspxhome.com