.net6-jwt实现认证和自定义策略授权

news/2025/2/3 15:47:29/文章来源:https://www.cnblogs.com/mingcore/p/18697525

场景

客户端根据用户名和密码访问登录接口获取token,服务端登录接口获取账号和密码进行验证,获取用户的角色,若角色是超级管理员则只能授权访问标记为超级管理员的接口,若角色是管理员则只能授权访问标记为管理员的接口。

实现JWT认证

安装JWT包
Microsoft.AspNetCore.Authentication.JwtBearer
配置JWT信息
"JwtSettings": {"Issuer": "YourIssuer","Audience": "YourAudience","SecretKey": "YourSuperSecretKeyThatShouldBeLongAndSecure"
},
创建JWT配置映射实体类
public class JwtSettings
{public string Issuer { get; set; }public string Audience { get; set; }public string SecretKey { get; set; }
}
JWT认证服务配置和添加认证中间件
  // 配置 JWT 设置var jwtSettings = builder.Configuration.GetSection("JwtSettings").Get<JwtSettings>();// 添加认证服务builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ValidateIssuerSigningKey = true,ValidIssuer = jwtSettings.Issuer,ValidAudience = jwtSettings.Audience,IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey))};options.Events = new JwtBearerEvents{OnForbidden = async context =>{context.Response.StatusCode = 403;// await context.Response.WriteAsync("服务端拒绝访问:当前身份没有权限访问,请联系管理员开放权限");await context.Response.WriteAsJsonAsync(new { message = "服务端拒绝访问:当前身份没有权限访问,请联系管理员开放权限" });}};});var app = builder.Build();
app.UseAuthentication();

实现自定义策略授权

定义权限策略类
 /// <summary>/// 权限策略类/// </summary>public class PermissionRequirement : IAuthorizationRequirement{public string _roleName { get; }public PermissionRequirement(string RoleName){_roleName = RoleName;}}

IAuthorizationRequirement 用于定义授权策略中的具体要求。当你需要实现自定义的授权逻辑时,可以创建实现该接口的类,然后将这些类添加到授权策略中。在用户请求访问受保护资源时,授权系统会检查用户是否满足这些要求。

定义策略处理类
public class PermissionRequirementHandler : AuthorizationHandler<PermissionRequirement>
{protected  override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement){if (context.User.HasClaim(c => c.Type == ClaimTypes.Role && c.Value == requirement._roleName)){context.Succeed(requirement);}else{context.Fail();}await Task.CompletedTask;}
}

AuthorizationHandler 是一个抽象类,位于 Microsoft.AspNetCore.Authorization 命名空间下。它的主要作用是根据特定的授权要求(实现 IAuthorizationRequirement 接口的类)来判断用户是否有权限访问受保护的资源。开发者需要继承 AuthorizationHandler<TRequirement> 泛型类(其中 TRequirement 是具体的授权要求类型),并重写 HandleRequirementAsync 方法来实现自定义的授权逻辑。

配置自定义策略授权和添加授权中间件
  // 添加自定义授权策略builder.Services.AddAuthorization(options =>{options.AddPolicy("AdminPolicy", policy => policy.Requirements.Add(new PermissionRequirement("Admin")));options.AddPolicy("SuperAdminPolicy", policy => policy.Requirements.Add(new PermissionRequirement("SuperAdmin")));});var app = builder.Build();
app.UseAuthorization(); //注意,授权中间件放在认证中间件后面
依赖注入
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped<IAuthorizationHandler, PermissionRequirementHandler>();

实现接口

创建请求实体
 public class LoginRequest{public string username { get; set; }public string password { get; set; }}
创建接口

在管理员和超级管理员接口前加上特性进行区分。

 [Route("api/[controller]")][ApiController]public class TestController : ControllerBase{private readonly IConfiguration _configuration;public TestController(IConfiguration configuration){_configuration = configuration;}[HttpPost("login")]public IActionResult Login(LoginRequest request){string role = string.Empty;if (request.username == "a" && request.password == "123456"){role = "Admin";}else if (request.username == "b" && request.password == "123456"){role = "SuperAdmin";}var jwtSettings = _configuration.GetSection("JwtSettings").Get<JwtSettings>();var tokenHandler = new JwtSecurityTokenHandler();var key = Encoding.ASCII.GetBytes(jwtSettings.SecretKey);var tokenDescriptor = new SecurityTokenDescriptor{Subject = new ClaimsIdentity(new[]{new Claim(ClaimTypes.Name, request.username),new Claim(ClaimTypes.Role, role)}),Issuer = jwtSettings.Issuer,Audience = jwtSettings.Audience,Expires = DateTime.UtcNow.AddHours(1),SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)};var token = tokenHandler.CreateToken(tokenDescriptor);string tokenString = tokenHandler.WriteToken(token);return Ok(new { token = tokenString, message = "登录成功" });}[HttpGet("GetAdminUserInformation")][Authorize(Policy = "AdminPolicy")]public IActionResult GetAdminUserInformation(){return Ok(new { Name = "管理员", Age = 18, Sex = "男" });}[HttpGet("GetSuperAdminInformation")][Authorize(Policy = "SuperAdminPolicy")]public IActionResult GetSuperAdminInformation(){return Ok(new { Name = "超级管理员", Age = 19, Sex = "男" });}}

请求测试

用管理员账号访问管理员接口ok,访问超级管理员接口返回403

用超级管理员账号访问超级管理员接口ok,访问管理员接口同样返回403

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878279.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「ZJOI2017」树状数组 题解

前言 题目链接:洛谷;UOJ;LOJ。 UOJ 上有很强的数据。 题意简述 yzh 做 OI 题维护序列 \(\{a_n\}\)。 她实现了一个后缀和查询函数 \(\displaystyle f(x) = \begin{cases} 0 & \text{ if } x=0 \\ \sum\limits_{i=x}^n a_i & \text{ otherwise } \end{cases}\),和…

什么是SDK?

1. 什么是SDK?1.1. SDK的定义 1.2. SDK的组成 1.3. 举例说明1.3.1. 【示例一】 OpenCV 1.3.2. 【示例二】 JDK 1.3.3. 【示例三】微信SDK2. SDK与API2.1. 什么是API? 2.2. SDK与API的关系3. 什么是SDK开发?3.1. SDK开发包含哪些过程? 3.2. SDK开发的目标是什么? 3.3. SDK开…

小蚁摄像头通过rclone+alist实现监控视频自动上传至云盘

最近,我才发现我白嫖的一刻相册空间才到5g于是就想着把监控录制的视频全传到里面可是,这么搞好像有点麻烦,能不能让我的摄像头自己上传呢? 我的摄像头的型号是小蚁 1080p,刷入了yi-hack-v5 alist 开启ftp yi-hack-v5 ftp界面结果发现不行,放弃了 又看到这位老哥的samba方…

材料检测取样手册系统

为方便查询,特写了查询系统,支持桌面版和网页版,支持Excel导入数据库,支持数据库导出Excel,支持数据库备份,支持恢复数据库。数据库为MySQL

《操作系统真象还原》第十二章 进一步完善内核

本文是对《操作系统真象还原》第十二章学习的笔记,欢迎大家一起交流,目前所有代码已托管至 fdx-xdf/MyTinyOS 。第十二章 进一步完善内核 本文是对《操作系统真象还原》第十二章学习的笔记,欢迎大家一起交流,目前所有代码已托管至 fdx-xdf/MyTinyOS 。 实现系统调用 getpid…

深度学习(RNN,LSTM,GRU)

三个网络的架构图: RNN:LSTM:GRU:特性对比列表:特性RNNLSTMGRU门控数量无3门(输入/遗忘/输出)2门(更新/重置)记忆机制 仅隐藏状态ht显式状态Ct + 隐藏状态ht隐式记忆(通过门控更新状态)核心操作 直接状态传递门控细胞状态更新 门控候选状态混合 计算复杂度O(d2)(1组权…

AI定制祝福视频,广州塔、动态彩灯、LED表白,直播互动新玩法(附下载链接)

在追剧的时候经常能看到一些浪漫的告白桥段,男主用圣诞彩灯表白、用城市标志性建筑的LED表白,或者在五光十色的烟花绽放后刻下女主角的名字,充满了仪式感和氛围感~现在,这样的表白效果用AI软件就能实现了,在社交平台上甚至还出现了类似的直播内容,观众送热气球或者其他礼…

VMware ARIA缺陷,黑客可获用户权限,哪些版本受影响?

VMware发布了安全更新,以修补影响VMware ARIA操作和日志操作的五个安全缺陷,并警告客户,黑客可以利用他们获得提升的访问或获得敏感信息。发行 安全 更新要补丁五安全 缺陷 影响VMware ARIA操作和日志操作,警告客户攻击者可以开发他们提高了使用权或者获得 敏感的信息。 列…

1. 2025年:致每一位在软件测试道路上奋斗的伙伴

亲爱的读者朋友们: 新年好!时光荏苒,转眼间我们已经迈入2025年。在这辞旧迎新的时刻,我怀着无比感恩的心情,向一路相伴的每一位软件测试从业者、爱好者以及关注者们致以最诚挚的祝福!愿大家在新的一年里,健康平安,事业有成,代码无Bug,需求皆清晰! 过去的一年,是软件测试行业蓬勃…

执行npm run dev时,报错10% building 2/5 modules 3 active node,如何解决?

错误信息如下:原因:版本问题,为了不替换node版本使用如下方法 在package.json文件下 将 "dev": " vue-cli-service serve", "build:prod": "vue-cli-service build", "build:stage": "vue-cli-service build --mode…

Make your ternimal more useful

目录引入Iterm2配置和Zshell配置TmuxVim配置基本使用插件配置Coc默认配置快捷键说明NerdTree快捷键分屏:Buffer, Windows和Tab 引入 本着好程序员要用好终端的信念,加之在使用mac过程中对快捷键依赖度增加,对鼠标的依赖逐渐减少,所以打算尝试配置终端的代码编写环境。 不曾…