.Net 8.0 Web API下使用JWT登录和鉴权

BaekKim 2024-08-08 10:33:01 阅读 93

NuGet添加:

Microsoft.AspNetCore.Authentication.JwtBearer

JWT

JWT把登录信息(也称为令牌)保存在客户端;

JWT由三部分组成:Header,PayLoad,Signature;

为了防止客户端造假,保存在客户端的令牌经过了签名处理,签名的密钥只有客户端知道,每次服务器端收到客户端提交过来的令牌时检查签名(Signature);

使用

在appsetting.json中"ConnectionStrings"下配置JWT的密钥;

<code>   "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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。