NuGet添加:
- Microsoft.AspNetCore.Authentication.JwtBearer
JWT
JWT把登录信息(也称为令牌)保存在客户端;
JWT由三部分组成:Header,PayLoad,Signature;
为了防止客户端造假,保存在客户端的令牌经过了签名处理,签名的密钥只有客户端知道,每次服务器端收到客户端提交过来的令牌时检查签名(Signature);
使用
- 在appsetting.json中"ConnectionStrings"下配置JWT的密钥;
"JwtSecretKey": "sadae21iasuhduashdu1h2ihduah",
- 在program.cs中注册 JWT 身份验证服务并启用
//启动Jwt身份验证 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => { var jwtSecretKey =builder.Configuration.GetConnectionString("JwtSecretKey"); options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false,//验证令牌的发行者是否有效 ValidateAudience = false,//验证令牌的受众是否有效 ValidateLifetime = true,//验证令牌的有效期 ValidateIssuerSigningKey = true,//验证令牌的签名密钥是否有效 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecretKey)) // 替换为你的密钥 }; }); //启动鉴权 builder.Services.AddAuthorization(options => { //定义一个名为 "Admin" 的授权策略。 //该策略要求 JWT 令牌中必须包含一个 "userRole" 声明,其值为 "admin"。 options.AddPolicy("Admin", policy => policy.RequireClaim("userRole", "admin")); //定义一个名为 "User" 的授权策略。 //该策略要求 JWT 令牌中必须包含一个 "userRole" 声明,其值为 "user"。 options.AddPolicy("User", policy => policy.RequireClaim("userRole", "user")); }); app.UseAuthentication();// 启用身份验证 app.UseAuthorization();// 启用授权
- 定义生成Jwt的方法
``````using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using AiAnswerBackend.Config; using Microsoft.IdentityModel.Tokens; namespace AiAnswerBackend.Utils; public class JwtUtils { public static string GenerateToken(Guid userId,string userRole) { var claims = new[] { //JwtRegisteredClaimNames.Sub: // 这是一个预定义的 JWT 声明类型,表示 "subject"(主体)。 // 在此上下文中,它通常用于存储用户的唯一标识符(如用户名或用户ID)。 new Claim("userId", userId.ToString()), new Claim("userRole", userRole) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("sadae21iasuhduashdu1h2ihduah"));//""内填自己的密钥,要足够长。 var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( claims: claims, expires: DateTime.Now.AddMinutes(60),//过期时间 signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token); } }
在Controller中使用:`````` [Authorize(Policy = "User")] [HttpGet("test")] public async Task<string> Test() { var userRole = User.FindFirst("userRole").Value; var userId = User.FindFirst("userId").Value; return "OK"+userRole+userId; }
注意:前端发送请求时要在请求头中加上字段 Authorization :"Bearer{Bearer后要添加一个空格}+{对应账号的Token}"即:Bearer空格Token
版权归原作者 BaekKim 所有, 如有侵权,请联系我们删除。