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

基于claims 角色控制

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

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

通过Claims中的

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

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

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

基于策略控制

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

 [Authorize(Policy ="policyname")]
  services.AddAuthorization(options => {
options.AddPolicy("policyname", policy => {
policy.RequireRole("rolename1", "rolename2");
policy.RequireClaim("claimname");
policy.RequireUserName("username");
} );
});

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

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

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

基于claims 功能点控制

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

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

下面看下实现代码

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AuthorizeCodeAttribute : Attribute, IAsyncAuthorizationFilter
{
public AuthorizeCodeAttribute(string name)
{
Name = name;
} public string Name { get; set; }
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{ if (!context.HttpContext.User.HasClaim(c => c.Value == Name))
{
context.Result = new ForbidResult();
}
await Task.CompletedTask; }
}

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

 [AuthorizeCode(PermissionsConfig.ClassAdd)]
public IActionResult Create()
{
return View();
}

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

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. 【刷题】BZOJ 3495 PA2010 Riddle

    Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边. 要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n& ...

  2. redis scan迭代模糊匹配

    $redis = new Redis(); $redis->connect('localhost', 6379); $iterator = null; while (true) { $keys ...

  3. 【Revit API】创建相机视角

    在Revit中有一个相机功能可以以相机视角产生一个视图.一开始我在Revit2016的API文档中找关键词Camera,但是没什么收获. 其实这个相机功能的真正核心是创建透视视图:View3D.Cre ...

  4. sql server 小技巧(6) Cannot resolve the collation conflict between "Latin1_General_CI_AI" and "Chinese_PRC_CI_AS" in the equal to operation

    今天查询二个db,出现这个错误,二种方法,一种是把db里的collation改成一样的:如果不方便可以直接在sql语句后面转一下: select * from table where crm_mscr ...

  5. 洛谷 P2224 [HNOI2001]产品加工 解题报告

    P2224 [HNOI2001]产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需 ...

  6. bzoj 4664: Count

    这道题和bzoj上一道叫魔法碰撞的题很像,只不过做法更加巧妙了. 一开始的想法是$f[i][j][k][0/1/2]$表示后i个数有j段当前混乱程度为k的方案,最后一维表示边界还能放几个. 转移的时候 ...

  7. 界面编程之QT的事件20180727

    /*******************************************************************************************/ 一.事件 1 ...

  8. HDU 3966 树链剖分+树状数组 模板

    Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. ubuntu ssh root登陆

    原文:https://blog.csdn.net/wy_97/article/details/78294562 1.默认使用ubuntu用户登录,密码为服务器配置时设置的密码,可在重置密码中修改 2. ...

  10. win32控制台变服务代码

    1.服务的主函数以及以及函数的声明,全局变量的定义 #define SERVICE_NAME "srv_follow" SERVICE_STATUS g_ServiceStatus ...