第二步:生成Jwt认证--用于角色的认证权限(加密)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | 生成Jwt认证用于角色的认证权限(加密)以后与RBAC使用 一、首先,创建用户表创建表名如下: /// <summary> /// 用户ID /// </summary> [Key] public int UserId { get ; set ; } /// <summary> /// 用户名 /// </summary> public string ? UserName { get ; set ; } /// <summary> /// 密码 /// </summary> public string ? Password { get ; set ; } /// <summary> /// 秘钥 用于储存Jwt生成的Token /// </summary> public string ?Token { get ; set ; } 二、:下载JWT的NuGet包 Microsoft.AspNetCore.Authentication.JwtBearer 三、在Program中写入如下代码 因为是对称加密,所以封装一个秘钥,以便调用 public class Const { //注意 jwtkey 长度要大于20 否者会报错 public static string jwtkey = "qwertyuiopasdfghjklzxcvbnm" ; } 注意 :Program 为了减少文件的冲突性所以要在秘钥类下边再次创建个类,存放中间件等 public class Const { public static string jwtkey = "qwertyuiopasdfghjklzxcvbnm" ; } public class Program { public static void Main( string [] args) { 此处省略注入上下文类和注入其他代码...... //身份认证 //AddAuthentication:添加身份验证 //JwtBearerDefaults.AuthenticationScheme 是 JWT Bearer 认证的默认方案名称。 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(builder => { //TokenValidationParameters 是一个用于验证 JWT 令牌的参数对象 builder.TokenValidationParameters = new TokenValidationParameters { //验证 ValidateActor = false , //验证令牌的 “actor”(操作者)声明。 ValidateIssuer = false , //验证令牌的 “issuer”(颁发者)声明。 ValidateAudience = false , //验证令牌的 “audience”(受众)声明。 ValidIssuer = "2013A" , //令牌颁发机构的标识符 ValidAudience = "2013A" , //令牌的受众群体。 //使用指定的密钥来验证令牌的签名 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.jwtkey)) //对称密钥,通过将字符串编码为UTF8字节生成密钥 }; //Events:属性,处理认证过程中不同阶段时间的回调方法 //JwtBearerEvents:一个包含各种事件委托的类(通过实例并通过Events属性赋值来为不同的事件操作提供自定义的逻辑) builder.Events = new JwtBearerEvents { //OnMessageReceived:事件、来自定义再接收消息时处理的jwt令牌的逻辑 OnMessageReceived = (x) => { //从请求cookie中获取并验证JWT令牌 var cooke = x.HttpContext.Request.Cookies[ "token" ]; x.Token = cooke; return Task.CompletedTask; } }; }); 此处省略中间件其他代码...... 四、在Program中写入认证和授权中间件(注意:先认证后授权) app.UseAuthentication(); //用户认证 app.UseAuthorization(); //用户授权 五、在控制器登录方法中生成Token并存入登录表中的Token 字段中 /// <summary> /// 登录 /// </summary> /// <param name="UserName">用户名</param> /// <param name="UserPassword">密码</param> /// <returns></returns> [HttpGet] [AllowAnonymous] //允许匿名访问 public IActionResult UserLogin( string ? UserName, string ? UserPassword) { //用户登录 var userlist = rbac.UserLogin(UserName, UserPassword); //把写进去的密钥改变成计算机的二进制 //Encoding:用来处理不同语言之间的格式 var ketBytes = Encoding.UTF8.GetBytes(Const.jwtkey); //实例化,最终生成token JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler(); //令牌描述 var tokenDescriptor = new SecurityTokenDescriptor { //过期时间 Expires= DateTime.Now.AddDays(1), //Subject:主题 获取到用户id和用户名 Subject = new ClaimsIdentity( new [] { new Claim( "id" , userlist.UserId.ToString()), new Claim( "name" , UserName) }) { }, //SigningCredentials:签名凭据(HmacSha256算法)进行加密 SigningCredentials = new SigningCredentials( new SymmetricSecurityKey(ketBytes),SecurityAlgorithms.HmacSha256) }; //CreateJwtSecurityToken 是 JwtSecurityTokenHandler 类中的一个方法,用于创建 JWT 安全令牌。 JwtSecurityToken token = handler.CreateJwtSecurityToken(tokenDescriptor); var jwttoken = handler.WriteToken(token); userlist.UserToken = jwttoken; Response.Cookies.Append( "token" , userlist.UserToken); return Ok(userlist); } 然后登录发现Token被赋值一大长串秘钥,到此生成Jwt完毕 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具