.NetCore中如果实现权限控制的问题,当我们访问到一个Action操作的时候,我们需要进行权限控制

基于claims 角色控制

基于角色控制总觉得范围有点过大,而且控制起来感觉也不是太好,举一个例子就是,一个添加操作Action,如果通过角色控制,通过写起来就有点痛苦

如果一个添加操作有20个角色都可以访问,那么在角色上需要指定好所有的角色,通过用户中的角色Claims匹配访问

通过Claims中的

  1. claims.Add(new Claim(ClaimTypes.Role, "rolecode"));
  1. [Authorize(Roles ="rolecode")]

当然也可以通过自定实现 接口,下面功能点类似的方式,通过角色服务获取判断,这里需要处理的就是获取 角色属性上的角色名称 ActionDescriptor  、 IAuthorizeData 获取 Role的值

  1. if (!context.HttpContext.User.IsInRole("rolename"))
  2. {
  3. context.Result = new ForbidResult();
  4. }

基于策略控制

当然也可以通过策略处理,策略就是一个大杂烩,提供了不同的配置方案如下面给出的例子

  1. [Authorize(Policy ="policyname")]
  1. services.AddAuthorization(options => {
  2. options.AddPolicy("policyname", policy => {
  3. policy.RequireRole("rolename1", "rolename2");
  4. policy.RequireClaim("claimname");
  5. policy.RequireUserName("username");
  6. } );
  7. });

上面的方式感觉不是太好,有的时候我们需要动态的配置功能点权限

比如,在系统中添加了一个角色,这个角色也拥有管理其中的一个Action权限,这里就需要去设置action上的Role规则,如果使用基于角色Claim控制就显得很不好了

如果采用策略方式的话都需要去修改代码,而且还需要对系统很熟悉,那些地方使用了那些策略或者角色,这样也不行,所以我们采用下面的Claims功能点控制

基于claims 功能点控制

这里我们需要去创建一个属性(Attribute)标签,且实现 IAsyncAuthorizationFilter 接口

如果功能点不多,数据量比较小的情况下,可以把功能点信息直接添加到 claims中,如果过多 只能动态获取,或者动态读取缓存提高效率

下面看下实现代码

  1. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
  2. public class AuthorizeCodeAttribute : Attribute, IAsyncAuthorizationFilter
  3. {
  4. public AuthorizeCodeAttribute(string name)
  5. {
  6. Name = name;
  7. }
  8.  
  9. public string Name { get; set; }
  10. public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
  11. {
  12.  
  13. if (!context.HttpContext.User.HasClaim(c => c.Value == Name))
  14. {
  15. context.Result = new ForbidResult();
  16. }
  17. await Task.CompletedTask;
  18.  
  19. }
  20. }

接下来就是在Action上指定好相关的功能点编码就行了

  1. [AuthorizeCode(PermissionsConfig.ClassAdd)]
  2. public IActionResult Create()
  3. {
  4. return View();
  5. }

如果Claims信息过多可以通过获取服务动态查询得到后进行验证 或者 缓存服务(Redis、Cache)得到,在Startup中DI上你的服务即可

  1. var services= context.HttpContext.RequestServices.GetService<T>();

对于Claims信息的处理可以在登录 SignIn 的时候写入相关的Claims身份信息即可,这里需要提到的是 ClaimsIdentity(身份信息)、ClaimsPrincipal(身份人,当事人,身份所有人)

.NetCore中如何实现权限控制 基于Claim角色、策略、基于Claim功能点处理的更多相关文章

  1. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  2. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

  3. IOS中实例的权限控制

    @public.@protected.@private的使用 在OC中声明一个类的时候,可以使用上面 @public.@protected.@private三个关键字声明实例的权限,例如下面的代码: ...

  4. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  5. Java中的访问权限控制

    Java提供了public, private, protected 三个访问权限修饰词,提供了以下四种访问权限控制机制: 1.包访问权限: 2.Public访问权限: 3.Private访问权限: 4 ...

  6. WPF wpf中按钮操作权限控制

    权限控制我们有很多种方式可以实现. 这次项目中做个简单的权限控制,我们在所有按钮触发前判断,有权限则可执行. 我们自定义一个命令类. public class DelegateCommand : IC ...

  7. pc vue 项目中的菜单权限控制

    在pc 管理系统这种类型的产品,通常会涉及到账号权限的控制,不同的账号权限能浏览的功能模块是不同的,对应侧边栏菜单模块的显示也会不同. 场景一.(电商类管理系统) 登录 登录后,依次获取账号 toke ...

  8. RABC权限控制(页面操作角色,权限和进行分配)

    上一节主要说的是如何通过url进行权限控制,这一节就说一下如何开发一个权限控制的界面,这样我们就能很方便的创建角色,并分配给用户不同角色和不同权限. 1.编写角色管理页面 这个编写较为简单,主要是通过 ...

  9. ThinkPHP中:RBAC权限控制的实习步骤

    使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据 ...

随机推荐

  1. 去除百度搜索结果中的广告的 js 代码

    在百度页面下控制台里执行如下代码, 然后关掉控制台 setInterval(() => { try{ Array.from( document.querySelectorAll('#conten ...

  2. 「TJOI / HEOI2016」字符串

    「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...

  3. 【题解】 [POI2012]FES-Festival (差分约束)

    懒得复制题面,戳我戳我 Question: (因为网上找不到好的翻译,这里简单复述一下) 告诉你\(m1+m2\)个约束条件,然后要你找出\(X_1-X_n\)这些数字,求满足要求的数列中不同的数字个 ...

  4. 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)

    题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...

  5. 集合框架基础知识-----java基础知识

    Java集合框架 :接口:Collection.List .Set. Map:实现类:ArrayList.LinkedList.Vector.HashSet.TreeSet.HashMap.HashT ...

  6. 浅说搜索引擎和SEO

    搜索引擎 基本工作原理 信息收集功能 技术点SEO优化核心 优化重点 SEO优化 网站URL title信息 meta信息 图片ALT flash信息 frame框架 网页重要度特征 之前有看到一个师 ...

  7. 五行代码终极完美解决从IE6到Chrome所有浏览器的position:fixed;以及闪动问题

    这个方法其实已经使用很久了,之前主要在嵌入式WebQQ等产品中用过,现在拿出来分享一下吧,是目前最简洁的方式来实现ie6的position:fixed; 失效bug,以及的其他方法的闪动问题,CSS代 ...

  8. linq中let关键字学习

    linq中let关键字就是对子查询的一个别名,let子句用于在查询中添加一个新的局部变量,使其在后面的查询中可见. linq中let关键字实例 1.传统下的子查询与LET关键字的区别     C# 代 ...

  9. 数据绑定和第一个AngularJS Web应用

    <!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...

  10. [转]Centos 安装Sublime text 3

    本文简单介绍在CentOS上安装Sublime text 3, 转自:Centos 安装Sublime text 3 Step 1 :建立软件安装目录 # mkdir /opt # cd /opt S ...