什么是Claims?
这个直接阅读其他大神些的文章吧,解释得更好。
相关文章阅读:
 
claims 姑且叫做声明,可以理解为和用户相关的一条一条信息的描述,可以是用户的身份信息(Name,Email,ID)也可以是用户的角色,甚至是一些自定义的Claims
 
关于Claims 和 Claims - base, 博客园的讲述已经很多了, 可以查阅相关文章。这里只是介绍如何给予Asp.net Identity Claims 来实现业务系统的权限验证。
 
 
在使用Identity做为系统的登陆和权限验证时,常常会用到角色,其实角色也是一种Claims, 而且角色的验证也是ClaimsBase的。
 
新建一个asp.net core Web Application 项目,修改验证类型为: Individual User Accounts。使用默认的项目模板
 

默认的项目模板已经为我们集成好了基于Asp.net identity的 登陆验证功能。
运行项目,注册用户,登陆。
为了验证角色也是基于Claims的,我们并没有为用户设置角色。
现在想在访问Action时,添加上基于角色的验证。

显然是 无法访问 home/index的。

原因是因为我们并没有为用户添加“MyRole”这个角色。
 
假如我们并不想为用户添加一个"MyRole"的角色,而是想在用户登录时,为用户添加一个 ClaimType 为 Role的 Claims ,看看是否能通过验证。
OK, 来试试看。
 
重要对象:Claims, ClaimsIdentity ClaimsPrincipal
 
可以这样理解;
Claims:
ClaimsIdentity: 可以这样理解,一组Cliams 就构成了一个Identity,比如身份证:姓名,性别,身份证号,等一系列Claims组成了一个identity
ClaimsPrincipal: ClaimsIdentity的持有者。一个ClaimsPrincipal可以持有多个ClaimsIdentity。
了解了这些概念后,我们就知道如果要给用户添加新的/自定义的Claims该往哪加了。
 
而 asp.net Identity在登陆时,会通过 UserClaimsPrincipalFactory 的 CreateAsync,来创建 ClaimsPrincipal。
那么我们需要做的,就是继承UserClaimsPrincipalFactory, 自定义一个AppClaimsPrincipalFactory
并重写 CreateAsync方法
 
 public class AppClaimsPrincipalFactory:UserClaimsPrincipalFactory<ApplicationUser,IdentityRole>
{
public AppClaimsPrincipalFactory(UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
{
} public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await base.CreateAsync(user);
((ClaimsIdentity)principal.Identity).AddClaims(new[] {
new Claim(ClaimTypes.Role, "MyRole")
}); return principal;
}
}
 
在CreateAsync 方法中,先调用base.CreateAsync()方法,获取一个ClaimsPrinciapl对象,然后再往ClaimsPrincipal。Identity中 添加我们想要的自定 Claims。
 
如图, 我们加入 new Claim(ClaimTypes.Role, "MyRole")
 
然后在Start Up 方法中,将重写的AppClaimsPrincipalFactory 注入到服务中
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration); services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders(); services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>(); services.AddMvc(); // Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
启动,运行,home/index页面可以正常访问了。
可以得知,Role 也是基于 Claims base的。
既然自定义的Claims 也能完成权限验证,那么在业务系统中,也通过各种Claims来完成各种权限验证。类似于,登陆系统后,系统给你发放各种证件,然后就可以通过你所拥有的证件,在系统中通行了。
 
接下来,我们根据业务需要,来定制各种Claims,完成权限验证
 
 
 
 
 
 

Asp.net Core, 基于 claims 实现权限验证 - 引导篇的更多相关文章

  1. Asp.net Core2.0, 基于 claims 实现权限验证

    https://www.cnblogs.com/KimmyLee/p/6430474.html

  2. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  3. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

  4. ASP.NET Core 基于声明的访问控制到底是什么鬼?

    从ASP.NET 4.x到ASP.NET Core,内置身份验证已从基于角色的访问控制(RBAC)转变为基于声明的访问控制(CBAC). 我们常用的HttpContext.User属性ASP.NET ...

  5. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  6. Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. Asp.Net Core 项目实战之权限管理系统(5) 用户登录

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. Asp.Net Core 项目实战之权限管理系统(6) 功能管理

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. Asp.Net Core 项目实战之权限管理系统(7) 组织机构、角色、用户权限

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. Delphi 中窗口文件与无窗口Pas文件的区别 (MTM)

    implementation {$R *.dfm}  ---- 带窗口的 dfm -- 一般的 windows 窗口 {$R *.fmx}  ---- 带窗口的 fmx -- 一般的 FireMonk ...

  2. js如何去除多个cookie?

    转自:https://zhidao.baidu.com/question/211006012.html :1:设置cookie 最简单的就是:document.cookie="user=aa ...

  3. zookeeper Java API 简单操作示例

    本文主要介绍如何在java IDE中如何应用使用客户端与zookeeper服务器通信. 首先搭建maven环境,并在pom文件中加入zookeeper引用包: <!-- https://mvnr ...

  4. 160708、JQuery解析XML数据的demo

    用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 方案1 当后台返回的数据类型是xml对象 ...

  5. 【IDEA】IDEA使用教程+技巧

    一.Intellij IDEA 中文教程 · GitBook https://legacy.gitbook.com/book/dancon/intellij-idea/details 注:一般来说参考 ...

  6. 复制新项目 ,tomcat部署时名字还是旧项目名

    基于一个就项目 copy 成新项目   关于项目名注意点: 在工作空间下  copy一份新项目 1首先在目录将项目名字更改. 2.在新项目下 找到 [.project]文件  将里面的nama更改 3 ...

  7. php 正则表达式二.基本语法

    官方手册正则语法:http://php.net/manual/zh/reference.pcre.pattern.syntax.php 正则表达式在线测试工具:regexpal 正则表达式的匹配先后顺 ...

  8. mysql几种引擎和使用场景

    https://blog.csdn.net/cool_wayen/article/details/79585277 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建. ...

  9. 【转】Spring中@Component的作用

    今天在写程序的时候看见一个以前没有见过的注解(@Component),在网上查找过后,经过实践,决定把它记录下来. 1.@controller 控制器(注入服务) 用于标注控制层,相当于struts中 ...

  10. 再谈Redis应用场景(转)

    原文:在谈Redis应用场景 一.MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样 ...