什么是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. UIActionSheet样式问题心得

    下午在做一个iPad的项目,需要用到一个 UIActionSheet. 点击popView中的“sort”按钮,触发出一个ActionSheet. self.action = [[[UIActionS ...

  2. SSM框架---详细整合教程

    http://blog.csdn.net/zhshulin/article/details/37956105/

  3. delphi弹出信息框大全(转载)

    1. 警告信息框 MessageBox(Handle,'警告信息框','警告信息框',MB_ICONWARNING); 2.疑问信息框 MessageBox(Handle,'疑问信息框','疑问信息框 ...

  4. 巨蟒python全栈开发-第15天 装饰器

    一.今日内容总览 关于函数的装饰器1.装饰器(重点,难点)(要求:反复写,代码不多但是很绕) 开闭原则:(比如,菜单是拆散的,一点点搞的,用友拆散自己的功能,以后就不用开发了) (1)对功能的扩展开放 ...

  5. 超哥带你学网络编程部分blog

    https://www.cnblogs.com/clschao/articles/9593164.html  网络编程 https://www.cnblogs.com/clschao/articles ...

  6. word2007的配置进度怎么产生的?如何解决?

    那么要怎么解决这个问题呢?既然是安装的,那么我们便道安装控制器文件夹下面去找原因.在WIN8操作系统下,文件夹位于:C:\Program Files (x86)\Common Files\Micros ...

  7. php accumulation rockmongo

    php -r 'echo substr(sprintf("%o",fileperms("./")),-4);'

  8. ubuntu微信

    方法1 – 使用Snap来安装微信 依次在terminal 执行一下命令 sudo apt install snapd snapd-xdg-open sudo snap install electro ...

  9. 一段能瞬间秒杀所有版本IE的简单HTML代码

    许多人都非常讨厌InternetExplorer,在西方万圣节即将到来之际,让我们来看一个真正吓人的东西——如何用一段简单的HTML和CSS,将任何版本的IE搞死.我们只需要简单地打开任意文本编辑器, ...

  10. 3.Write Scripts for the mongo Shell-官方文档摘录

    总结 1 使用js进行获取数据的方法 2 js方式和原生mongo shell的交互方式的区别写法 3 需要将所有数据打印出来使用到的循环示例 cursor = db.collection.find( ...