什么是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. ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]

    今天第一次遇到Failed to start component [StandardEngine[Catalina].StandardHost[localhost].错误,并且在错误提示的后半段出现了 ...

  2. 再论IBatisNet + Castle进行项目的开发

    随着项目的进展,Castle和IBatisNet给我的惊喜更多.Com+很重,不需要分布式的中小项目慎用,NHibernate虽好,NHibernate的2005-9-20发布了最新版本1.0-rc1 ...

  3. Android实例-退出程序

    Android实例-退出程序 http://www.cnblogs.com/FKdelphi unit Unit1; interface uses System.SysUtils, System.Ty ...

  4. 1.2_php验证码

    使用php生成动态的验证码图片 <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...

  5. python中的 try...except...finally 的用法

    python中的 try...except...finally 的用法 author:headsen chen date:2018-04-09  16:22:11 try, except, final ...

  6. instanceof和isInstance(Object obj) 和isAssignableFrom(Class cls)的区别和联系

    instanceof和isInstance(Object obj) 和isAssignableFrom(Class cls)的区别和联系          编程的时候可能会遇到一个不知道它属于哪个类的 ...

  7. Centos6.5下Samba服务器的安装和配置

    1.安装samba服务 # yum install samba samba-client samba-swat 2.安装包说明 samba-3.6.23-43.el6_9.x86_64----> ...

  8. jsp页面上读取MySQL数据库datetime时间显示问题

    mysql数据库中时间字段选用了datetime,如果通过java实现在jsp页面上显示时间为"年-月-日  时:分"等格式,那么如下代码就会有不同的结果! 实体类中两个变量: p ...

  9. 【我的Android进阶之旅】如何隐藏Android中EditText控件的默认下划线

    Android EditText控件是经常使用的控件,但是有时候我们并不需要它的一些默认的属性,比如说下划线,因为有时候这样的默认下划线看起来特别怪异,和其他控件在一起搭配的时候不协调,因此有时候就需 ...

  10. Flask(5)- Flask-Session组件、WTForms组件、数据库连接池(POOL)

    一.Flask-Session 我们使用过flask内置的session,知道它是把session存放在浏览器,即客户端.今天要学习的flask-session是flask的第三方组件,看一下它和fl ...