通过中间件添加用户的Claim

本文主要介绍 Sang.AspNetCore.RoleBasedAuthorization[1] 库如何通过中间件实现对用户 Claim 的添加。

背景

前面我们介绍了通过对自定义授权策略和自定义授权处理程序的使用实现了基本的RBAC权限设计,将大量的用户可访问资源及操作的标识直接放到用户的 JWT Token 中显然并不合适,这篇文章我们主要介绍通过中间件如何根据用户的角色添加用户的 Claim

实现

角色获取

首先我们需要提供一个接口 IRolePermission ,需要用户自行实现 GetRolePermissionClaimsByName 通过角色名获取用户的 List<Claim>。这里当然也可将用户自身拥有的特定 Claim 也加入进去。

public interface IRolePermission
{/// <summary>/// 获取角色的所有 Permission /// </summary>/// <param name="roleName"></param>/// <returns></returns>Task<List<Claim>> GetRolePermissionClaimsByName(string roleName);
}

中间件核心逻辑

创建中间件 RolePermissionMiddleware ,通过 DI 注入 IRolePermission rolePermission。核心的执行逻辑为:

/// <summary>
/// 自定义中间件要执行的逻辑
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
}

要确保用户信息存在

if (context.User is null)
{await _next(context);return;
}

这里我们提供了一个可选的参数,使中间件可以单独使用,也可以仅在含有ResourceAttribute标记时执行。

var endpoint = context.Features.Get<IEndpointFeature>()?.Endpoint;
if (endpoint is null)
{await _next(context);return;
}
var endpointMetaData = endpoint!.Metadata;
bool hasResourceAttribute = endpointMetaData.Any(x => x is ResourceAttribute);
if (!hasResourceAttribute)
{await _next(context);return;
}

该中间件主要的核心逻辑为读取用户所有的角色,然后查询角色对应的权限将其放入。

// 获取用户的所有角色
var roles = context.User.FindAll(ClaimTypes.Role);
// 逐个获取角色的 claims 并添加给 User
foreach (var role in roles.ToList())
{var roleclaims = await _rolePermission.GetRolePermissionClaimsByName(role.Value);if (roleclaims.Count() > 0){context.User.AddIdentity(new ClaimsIdentity(roleclaims));}
}

中间件注册

中间件的注册提供了可选的参数,同时需要添加用户角色查询服务。添加RolePermissionExtensions

/// <summary>
/// 添加根据角色名为 User 加入角色 Permission 的中间件
/// </summary>
/// <param name="app"></param>
/// <param name="configureOptions"></param>
/// <returns></returns>
public static IApplicationBuilder UseRolePermission(this IApplicationBuilder app, Action<RolePermissionOptions> configureOptions)
{var options = new RolePermissionOptions();configureOptions(options);return app.UseMiddleware<RolePermissionMiddleware>(options);
}/// <summary>
/// 添加根据角色名为 User 加入角色 Permission 的中间件
/// </summary>
/// <param name="app"></param>
/// <returns></returns>
public static IApplicationBuilder UseRolePermission(this IApplicationBuilder app)
{return app.UseMiddleware<RolePermissionMiddleware>(new RolePermissionOptions());
}/// <summary>
/// 添加角色权限查询服务
/// </summary>
/// <typeparam name="RolePermission">获取角色权限的实现</typeparam>
/// <param name="Services"></param>
public static void AddRolePermission<RolePermission>(this IServiceCollection Services) where RolePermission : class, IRolePermission
{Services.AddSingleton<IRolePermission, RolePermission>();
}

最后

需要特别注意的是,这个中间件启用的位置。需要在 UseAuthentication 之后 UseAuthorization 之前,也就是说要在验证了用户后,开始检查用户权限前将用户的角色权限赋予给 context.User

本文介绍的相关代码已经提供 Nuget 包,并开源了代码,感兴趣的同学可以查阅: https://github.com/sangyuxiaowu/Sang.AspNetCore.RoleBasedAuthorization

如有错漏之处,敬请指正。

References

[1] Sang.AspNetCore.RoleBasedAuthorization: https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization

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

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

相关文章

部署也是工程的一部分,也要编程(自动化)

部署和开发一样&#xff0c;同样面临变化。同样有复杂的细节。 同样应该代码化&#xff0c;自动化。把复杂性、思路&#xff0c;操作&#xff0c;都固化下来&#xff0c;显式表达。 不要“雪花”式配置。 把最近看的文章摘抄一下 集句&#xff1a; 1频繁做让你感到痛苦的事情&a…

KDD走进阿里 数百专家聚集探讨产学研一体化

6月29日&#xff0c;由阿里巴巴集团、中国中文信息学会、KDD China联合主办的数据挖掘前沿发展与未来论坛在杭州举行&#xff0c;会议吸引了来自国际顶级高校和知名企业的近300名专家学者到场参会、近30000人在线观看。论坛除了分享最新的数据挖掘领域最新科研成果及研发思路外…

zookeeper学习03 使用场景

zookeeper实际应用场景 zookeeper能够实现哪些场景 1&#xff09;订阅发布/配置中心 watcher机制 统一配置管理&#xff08;disconf&#xff09; 实现配置信息的集中式原理和数据的动态更新 实现配置中心有俩种模式&#xff1a;push,pull 长轮询 zookeeper采用的是推拉相结合的…

php模板引擎循环start,PHP模板引擎Smarty内建函数section,sectionelse用法详解

本文实例讲述了PHP模板引擎Smarty内建函数section,sectionelse用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;section 是 Smarty 模板中除了 foreach 以外的另一种处理循环的方案&#xff0c;section 比 foreach 要灵活&#xff0c;就像是一个改进的 foreach 语句…

OpenHarmony操作系统与龙芯2K1000LA芯片完成适配,龙架构平台获得开源鸿蒙认证

近日&#xff0c;龙芯中科与软通动力控股公司鸿湖万联共同完成OpenHarmony操作系统与龙芯2K1000LA处理器的适配&#xff0c;“乘风1000”开发板&#xff08;搭载龙芯2K1000LA&#xff09;荣获OpenHarmony生态产品兼容性证书。至此&#xff0c;万物互联的OpenHarmony生态体系再次…

struts2开发action 的三种方法以及通配符、路径匹配原则、常量

struts2开发action 的三种方法 1、继承ActionSupport public class UserAction extends ActionSupport {// Action中业务处理方法public String login() {System.out.println("UserAction.login()"); // return "success";return SUCCESS;} } 2、实现…

闭包--闭包作用之保护(一)

闭包作用:保护 形成私有作用域,保护里面的私有变量不受外界干扰例如多人协作开发&#xff1a;A的代码有fn(),B的代码有fn(),但是他们不相互影响 // A的代码<script>(function() {function fn1() {console.log("aa")}window.fn1 fn1;})()// window.fn1() //11&…

left join 和 inner join

2019独角兽企业重金招聘Python工程师标准>>> left join 和 inner join 首先 MySQL 中 inner join 的效率确实要高于 left join。所以没必要使用 left join 转弯成 inner join 的效果。这样不但效率降低&#xff0c;可读性也会降低。 Number1 select from t1 left j…

oracle 数据库中拆分,oracle数据库字符串拆分

第一种 直接返回切分的字符串create or replace function Get_StrArrayLength(av_str varchar2,--要分割的字符串av_split varchar2 --分隔符号)return numberislv_str varchar2(1000);lv_length number;beginlv_str:ltrim(rtrim(av_str));lv_length:0;while instr(lv_str,av_s…

Vue3+.NET6,轻松开发管理后台!(可复用)

在GitHub是没找到简单好用的Vue3.NET6管理后台项目&#xff0c;有收藏的请评论区分享。这里分享一套Vue3 Axios TS Vite Element Plus .NET 6 WebAPI JWT SqlSugar的通用管理后台&#xff0c;前后端分离架构&#xff0c;各种最新框架组件&#xff0c;实现了管理后台几乎…

iOS网络请求安全认证(JWT,RSA)

在网络世界中&#xff0c;安全是一个很重要的问题&#xff0c;以往的HTTP请求已经不能承担这个安全任务&#xff0c;抓包工具一抓&#xff0c;你的所有网络请求全都曝光。当然&#xff0c;你可能会采用加密算法来加密数据&#xff0c;但是这仍然不够。 在移动端和服务器的通信过…

微信小程序黑客马拉松即将开始,来做最酷的 Mini Program Creators!

微信小程序黑客马拉松正式启动 近日&#xff0c;小程序斩获一项世界级殊荣——作为一项全新的技术和应用创新&#xff0c;小程序首次获选世界互联网领先科技成果。目前小程序应用数量已超过 100 万&#xff0c;覆盖了 200 多个细分行业&#xff0c;日活用户达到 2 亿。 微信小程…

oracle 文件写 n r,[oracle]log_archive_dest_n与DB_RECOVERY_FILE_DEST

DB_RECOVERY_FILE_DEST参数是默认的flashrecovery area的路径&#xff0c;里面存放有归档日志、闪回日志以及rman的备份文件等文件。LOG_ARCHIVE_DEST_n参数是存放归档日志的路径&#xff0c;n表示1~10的一个整数&#xff0c;由于归档日志在recovery的时候担当了重要的角色&…

记一次 .NET 某娱乐聊天流平台 CPU 爆高分析

一&#xff1a;背景 1.讲故事前段时间有位朋友加微信&#xff0c;说他的程序直接 CPU100%&#xff0c;每次只能手工介入重启&#xff0c;让我帮忙看下到底怎么回事&#xff0c;哈哈&#xff0c;这种CPU打满的事故&#xff0c;程序员压力会非常大, 我让朋友在 CPU 高的时候抓 2 …

linux下mariadb大小写敏感

2019独角兽企业重金招聘Python工程师标准>>> Linux下安装好mariadb后&#xff0c;在使用时会发现mariadb对大小写敏感&#xff0c;这对开发带来一定的不利&#xff0c;这时只要在配置文件中配置一下&#xff0c;取消大小写敏感即可&#xff1a; sudo vi /etc/MySQL/…

评论列表显示及排序,个人中心显示

1.显示所有评论{% for foo in ques.comments %} 2.所有评论排序uquestion db.relationship(Question, backrefdb.backref(comments, order_bycreat_time.desc)) 3.显示评论条数{{ ques.comments|length }} 1题代码如下&#xff1a; <h3>评论区:({{ ques.comments|length…

软件工程现行国标汇集

GB/T 8566-2007 《信息技术 软件生存周期过程》GB/T 8567-2006 《计算机软件文档编制规范》 GB/T 9385-2008《计算机软件需求规格说明规范》GB/T 9386-2008 《计算机软件测试文档编制规范》 GB/T 11457-2006《信息技术 软件工程术语》GB/T 14394-2008《计算机软件可靠性和可维护…

oracle listagg方法,Oracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg...

Oracle实现字符串拼接和分离功能的方法(LISTAGG函数)&#xff0c;oraclelistagg字符串拼接(String Aggregation Techniques)是数据处理时经常需要用到一个技术&#xff0c;比如需要按时间顺序拼装一个快递的运输记录&#xff0c;或者将流程中各个环节的处理人拼装为一个字符串。…

他俩都曾是技术大牛,创业这些年来有怎样的苦与乐?

这是头哥侃码的第263篇原创国庆假期回来&#xff0c;「头哥唠 B 唠」的直播仍在继续。这次我邀请了我工作上的老板和朋友&#xff0c;一起聊了聊关于 “技术创业路上的苦与乐”。熟悉他们两位的都知道&#xff0c;可以说是技术出身&#xff0c;然后创业当老板的代表。大家都知道…

maven,gradle本地缓存位置

gradle: 配置系统环境变量GRADLE_USER_HOME即可&#xff0c;值为缓存位置。 maven: 修改settings文件&#xff1a;maven的home路径下的conf文件夹下的settings.xml 对于有些IDEA&#xff0c;还需要配置。但是不要再打开项目后的FILE-->settings配置&#xff0c;而是需要在选…