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

NuGet添加:

  • Microsoft.AspNetCore.Authentication.JwtBearer

JWT

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

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

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

使用

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

    复制代码
    ? ?"JwtSecretKey": "sadae21iasuhduashdu1h2ihduah",
  2. 在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();// 启用授权
  3. 定义生成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);
    ? ?  }
    ?}
  4. 在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

相关推荐
Su米苏1 小时前
关于@vue-office/excel 渲染异常滚动失去内容
前端·vue.js·excel
灯澜忆梦1 小时前
【基于GO的Web开发10】gin获取HTML-Form表单提交参数
前端·后端·golang·html·gin
撑伞的鱼99372 小时前
2026年前端AI编程工具评测:Figma 还原、组件复用、跨文件联动三项对比
前端·ai编程·figma·效率工具·ai编程工具
码视野2 小时前
基于 Vue3 + Element Plus 的【微短剧剧本智能创作与分镜生产协同系统】设计与实现(含PRD/三端源码/大屏)
前端·人工智能·vue3
zzzzzz3102 小时前
36K stars 的“酷炫组件”,到底该怎么用才不显得用力过猛?
前端·react.js·动效
2401_894915535 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
rockey6279 小时前
C#脚本引擎之AScript与Jurassic、Jint对比
javascript·c#·.net·js·script·动态脚本
Profile排查笔记10 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
lzhdim11 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
denggun1234511 小时前
yield
前端·数据库·python