.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. Treasure Exploration POJ - 2594(最小边覆盖)

    因为是路  所以 如果 1——3  2——3    3——4   3——5 则 1——4  1——5  2——4   2——5 都是是合法的 又因为机器人是可以相遇的  所以 我们把所有的点 分别放在 ...

  2. (转)Java随机数

    1 随机数的三种产生方式 本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示. 广义上讲,Java中的随机数的有三种产生方式: (01). 通过System.currentTimeMil ...

  3. 20181108 Apache Commons Lang

    工具类 org.apache.commons.lang3 AnnotationUtils ArchUtils ArrayUtils BooleanUtils CharSetUtils CharUtil ...

  4. MySQL存储引擎对比

    MySQL存储引擎对比 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的存储引擎 大家应该知道MySQL的存储引擎应该是表级别的概念,因为我们无法再创建databas ...

  5. python---django使用数据库(orm)

    官方教程点击此处 项目默认使用sqlite DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os. ...

  6. 关于css中a标签的样式

    CSS为一些特殊效果准备了特定的工具,我们称之为“伪类”.其中有几项是我们经常用到的,下面我们就详细介绍一下经常用于定义链接样式的四个伪类,它们分别是: :link :visited :hover : ...

  7. spring注解 @Scheduled(cron = "0 0 1 * * *")实现定时的执行任务

    @Scheduled(cron = "0 0 1 * * *") 在使用该注解以前请做好以下准备工作,配置好相应的xm文件. 配置定时注解的步骤:http://blog.csdn. ...

  8. Nodejs stream模块-翻译

    花了两天时间尝试按照自己的话翻译了一下stream模块,以下内容皆翻译于:https://nodejs.org/api/stream.html. 目录 1  Stream(流)     1.1     ...

  9. 【转】VTL-vm模板的变量用法

    http://www.cnblogs.com/zengxlf/archive/2009/05/06/1451004.html 加载foot模块页 #parse("foot.vm") ...

  10. 【洛谷P2420】让我们异或吧

    题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...