当前位置:首页 » 《随便一记》 » 正文

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

7 人参与  2024年12月27日 16:01  分类 : 《随便一记》  评论

点击全文阅读


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


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/207803.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1