什么是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测试数据"));//密钥大小要超过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 }); ? ? ? ? }
到此这篇关于C# JWT权限验证的实现的文章就介绍到这了,更多相关C# JWT权限验证内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!