十年河东,十年河西,莫欺少年穷
学无止境,精益求精
之前写过 MVC webApi 的Jwt Token验证方式,博客地址为:JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现
由于Net升级过快,不得不温故而知新,因此才有这篇博客的诞生
首先关于JWT Token是什么,它是如何进行工作的,又是如何结合WebApi的,这些问题都可以尽情参考鄙人之前的博客。也就是上述的链接地址。
今天由于时间原因,暂时不写具体的实现,仅仅提供netCore Token的生成方法。
如下:
public class Contanst { /// <summary> /// This is a private key for Server /// //这个是生成Token时,服务端加密秘钥 属于私钥 /// </summary> public const string JwtSecurityKey = "Movit-Tech"; }
当然,这个密钥也可以写在配置文件中。
用户基本信息类
public class UserInfoModel { public string userId { get; set; } = Guid.NewGuid().ToString(); public string userSex { get; set; } = "男"; public string userPhone { get; set; } = "18137070152"; public string userAccount { get; set; } = "chenwolong"; public string userName { get; set; } = "陈卧龙"; public string userCompany { get; set; } = "盟拓软件(苏州)有限公司"; public string userRole { get; set; } = "SuperAdmin"; /* 等等其他属性 */ }
这里简单介绍下Token的使用,个人理解,主要分为以下几个步骤
1、用户请求登录验证WebApi接口,该接口用于验证用户的登录账户及密码,如果通过验证,返回给用户一个Token
2、用户拿到Token后,将Token放在Http请求头中,请求其他有权限限制的接口。在这里,我们可以把Token理解为令牌,未持有令牌的请求,是不被允许的。
3、用户获得的Token令牌有一定的时效,过期后,需要重新验证登录接口,待登录验证通过后,服务器会返回用户新的令牌。用户携带新的令牌进行接口请求。
OK,大致过程就是这样,权限控制更完善的做法是:Token中存放的信息结合数据库,Redis等存储的数据,返回用户可访问接口列表或其他数据、功能权限。
NetCore生成Token的方法如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using Microsoft.IdentityModel.Tokens; using NetCoreCommon; using NetCoreModels; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; namespace NetCoreTokenApi { public class TokenHelper { public string GetToken(UserInfoModel user) { var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(Contanst.JwtSecurityKey)); var claims = new Claim[] { new Claim(ClaimTypes.Name,user.userAccount), new Claim(ClaimTypes.NameIdentifier,user.userId), new Claim(ClaimTypes.Role,user.userRole), new Claim(ClaimTypes.Actor,user.userName), }; var expires = DateTime.Now.AddHours(12);//生命周期 12小时 var token = new JwtSecurityToken( issuer: user.userName,//非必须。issuer 请求实体,可以是发起请求的用户的信息, audience: "http://example.com",//非必须。接收该JWT的一方。 claims: claims, notBefore: DateTime.Now, expires: expires, signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)); //生成Token string jwtToken = new JwtSecurityTokenHandler().WriteToken(token); return jwtToken; } } }
时间原因,今天仅实现Token的生成,不结合接口进行相关测试。将来有时间了,会继续完善。
未完待续...
@天才卧龙的博客