ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal
前言
首先我们来看一下在ASP.NET时代,Authentication是如何使用的。下面介绍的是System.Web.Security.FormsAuthentication:
// 登录
System.Web.Security.FormsAuthentication.SetAuthCookie("userName", false);
if(User.Identity.IsAuthenticated) { // 已认证
}
// 退出登录
System.Web.Security.FormsAuthentication.SignOut();
这是一个最简单的认证用法:
- 用户填写账号密码并提交登录;
- 服务器应用通过
System.Web.Security.FormsAuthentication.SetAuthCookie(string userName, bool createPersistentCookie)来生成Auth Cookie,并返回到browser; - 用户进行下一个操作时,会带上Auth Cookie发到服务器应用;
- 服务器应用解析并绑定到
Controller.User属性上,通过User.Identity.IsAuthenticated判断用户是否已认证; - 最后通过
System.Web.Security.FormsAuthentication.SignOut()来删除Auth Cookie;
想要设置生成的Auth Cookie属性,可以通过修改web.cofig的<authentication>配置项:
<configuration>
...
<system.web>
<authentication mode="Forms" >
<forms cookieless="UseCookies" domain="" path="" name="" timeout="" loginUrl=""></forms>
</authentication>
</system.web>
....
</configuration>
更多配置项可查看FormsAuthenticationConfiguration。
Authentication in ASP.NET Core
虽然ASP.NET与ASP.NET Core的底层设计很不一样,但Authentication的基本用法并没有太大的改变,同样通过HttpContext.User来判断认证。
ASP.NET的Authorisation是role-based的,而ASP.NET Core的是基于claims-based的(虽然ASP.NET Core同样支持role-based,但这更多是为了向后兼容,推荐使用claims-based)。
Claims-based authentication
要理解Claims-based authentication,就必须理解Claim, ClaimsIdentity, ClaimsPrincipal这三者的关系。
Claim是对被认证主体特征的一种表述,比如:登录用户名是...,email是...,用户Id是...,其中的“登录用户名”,“email”,“用户Id”就是ClaimType。
对应现实中的事物,比如驾照,驾照中的“身份证号码:xxx”是一个claim,“姓名:xxx”是另一个claim。
一组claims构成了一个identity,具有这些claims的identity就是ClaimsIdentity ,驾照就是一种ClaimsIdentity,可以把ClaimsIdentity理解为“证件”,驾照是一种证件,护照也是一种证件。
ClaimsIdentity的持有者就是ClaimsPrincipal ,一个ClaimsPrincipal可以持有多个ClaimsIdentity,就比如一个人既持有驾照,又持有护照。
举例说明
上面对Claim, ClaimsIdentity, ClaimsPrincipal三者的描述可能还有些不太好理解,下面会举例说明这三者的关系:
以登机为例,在登机前需要完成以下步骤:
- 取登机牌
- 过安检
- VIP区候机(假设你是VIP)
1. 取登机牌
你到了机场,要向客服打印登机牌(虽然现在已经是通过机操打印的了),客服问你叫什么名字,并要求出示能证明你名字的相关证书,例如Passport,其中名字就是一个Claim,Passport就是一个ClaimsIdentity。
2. 过安检
当你拿到了登机牌(BoardingPass)并准备过安检,此时安检人员要求你出示航班号,此时你拿出登机牌给安检人员查看航班号,其中航班号就是一个Claim,BoardingPass就是一个ClaimsIdentity。
3. VIP区候机
当你通过安检进入了候机区,你是机场的VIP,就打算到VIP区休息一下,此时工作人员要求你出示VIP号,你拿出VIP片给工作人员查看,其中VIP号就是一个Claim,VIP片就是一个ClaimsIdentity。
上面的每个步骤如果都不能出示相应的ClaimsIdentity就会被拒绝执行指示,下面的图展示了这个过程:

最后全部的ClaimsIdentity代表了你本人,而你就是ClaimsPrincipal。
参考资料
- Introduction to Authentication with ASP.NET Core
- 理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文
ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal的更多相关文章
- ASP.NET Core Authentication系列(四)基于Cookie实现多应用间单点登录(SSO)
前言 本系列前三篇文章分别从ASP.NET Core认证的三个重要概念,到如何实现最简单的登录.注销和认证,再到如何配置Cookie 选项,来介绍如何使用ASP.NET Core认证.感兴趣的可以了解 ...
- ASP.NET Core Authentication系列(二)实现认证、登录和注销
前言 在上一篇文章介绍ASP.NET Core Authentication的三个重要概念,分别是Claim, ClaimsIdentity, ClaimsPrincipal,以及claims-bas ...
- ASP.NET Core Authentication系列(三)Cookie选项
前言 在本系列第一篇文章介绍了ASP.NET时代如何认证,并且介绍了如何通过web.config文件来配置Auth Cookie的选项. 第二篇文章介绍了如何使用Cookie认证,本文介绍几个常见的C ...
- 理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文
这篇英文博文是 Andrew Lock 写的 Introduction to Authentication with ASP.NET Core . 以下是简单的阅读笔记: -------------- ...
- 【转】理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文
这篇英文博文是 Andrew Lock 写的 Introduction to Authentication with ASP.NET Core . 以下是简单的阅读笔记: -------------- ...
- 理解ASP.NET Core验证模型 Claim, ClaimsIdentity, ClaimsPrincipal
Claim, ClaimsIdentity, ClaimsPrincipal: Claim:姓名:xxx,领证日期:xxx ClaimsIdentity:身份证/驾照 ClaimsPrincipal: ...
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇
==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之三 —— 配置
==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...
随机推荐
- spring怎么避免循环依赖
1.循环依赖 (1)概念 对象依赖分为强依赖和弱依赖: 强依赖指的是一个对象包含了另外一个对象的引用,例如:学生类中包含了课程类,在学生类中存在课程类的引用 创建课程类: @Data public c ...
- SpringBoot一统江湖
一 SpringBoot简介 SpringBoot是Spring框架的一个新子项目 用于创建Spring4.0项目 它的开发始于2013年 2014年4月发布1.0.0版本 它可以自动配置Spring ...
- Python-local variable 'raw_password' referenced before assignment
where? 执行Python程序的时候,报这个错 why? 变量作用域问题,在分支中定义的变量,当满足条件的时候则可以正确得到变量,当不满足条件的时候则报这个错 way? 把变量从分支中抽离到分支上 ...
- C 面向对象编程 --- 一模块的串口协议解析
// 任务目的// 解析串口收到的54个字节.这54个字节包含了8个车道的5大信息以及校验信息.// 实现了查询每条车道包含了哪些信息. #include <stdio.h>#includ ...
- 017 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 11 变量综合案例
017 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 11 变量综合案例 本文知识点:变量 相同类型的变量可以一次同时定义多个 例:可以一行代码同时定义2个变量x ...
- const放在函数前后的区别
转载:const放在函数前后的区别 一.const修饰指针 int b = 500; 1.const int * a = & b; 2.int const * a = & b; 3.i ...
- 洛谷比赛 「EZEC」 Round 4
洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...
- linux下的echo
echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串.linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下 ...
- CentOS7.7 系统下 virbr0 虚拟网卡的维护与管理
在 CentOS 7 系统的安装过程中,如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的 virbr0 网卡,这个是因为在虚拟化中有使用到 libvirtd 服务生 ...
- day65:nginx代理&nginx负载均衡
目录 1.nginx代理 2.nginx代理与配置 3.nginx负载均衡调度多web节点(静态页面) 4.nginx负载均衡调度多应用节点(blog) 5.nginx_proxy + web应用节点 ...