第二步:生成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完毕

  

posted @   耿有才  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示