前言

首先我们来看一下在ASP.NET时代,Authentication是如何使用的。下面介绍的是System.Web.Security.FormsAuthentication


// 登录
System.Web.Security.FormsAuthentication.SetAuthCookie("userName", false); if(User.Identity.IsAuthenticated) { // 已认证 } // 退出登录
System.Web.Security.FormsAuthentication.SignOut();

这是一个最简单的认证用法:

  1. 用户填写账号密码并提交登录;
  2. 服务器应用通过System.Web.Security.FormsAuthentication.SetAuthCookie(string userName, bool createPersistentCookie)来生成Auth Cookie,并返回到browser;
  3. 用户进行下一个操作时,会带上Auth Cookie发到服务器应用;
  4. 服务器应用解析并绑定到Controller.User属性上,通过User.Identity.IsAuthenticated判断用户是否已认证;
  5. 最后通过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三者的描述可能还有些不太好理解,下面会举例说明这三者的关系:

以登机为例,在登机前需要完成以下步骤:

  1. 取登机牌
  2. 过安检
  3. 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

参考资料

ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal的更多相关文章

  1. ASP.NET Core Authentication系列(四)基于Cookie实现多应用间单点登录(SSO)

    前言 本系列前三篇文章分别从ASP.NET Core认证的三个重要概念,到如何实现最简单的登录.注销和认证,再到如何配置Cookie 选项,来介绍如何使用ASP.NET Core认证.感兴趣的可以了解 ...

  2. ASP.NET Core Authentication系列(二)实现认证、登录和注销

    前言 在上一篇文章介绍ASP.NET Core Authentication的三个重要概念,分别是Claim, ClaimsIdentity, ClaimsPrincipal,以及claims-bas ...

  3. ASP.NET Core Authentication系列(三)Cookie选项

    前言 在本系列第一篇文章介绍了ASP.NET时代如何认证,并且介绍了如何通过web.config文件来配置Auth Cookie的选项. 第二篇文章介绍了如何使用Cookie认证,本文介绍几个常见的C ...

  4. 理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文

    这篇英文博文是 Andrew Lock 写的 Introduction to Authentication with ASP.NET Core . 以下是简单的阅读笔记: -------------- ...

  5. 【转】理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文

    这篇英文博文是 Andrew Lock 写的 Introduction to Authentication with ASP.NET Core . 以下是简单的阅读笔记: -------------- ...

  6. 理解ASP.NET Core验证模型 Claim, ClaimsIdentity, ClaimsPrincipal

    Claim, ClaimsIdentity, ClaimsPrincipal: Claim:姓名:xxx,领证日期:xxx ClaimsIdentity:身份证/驾照 ClaimsPrincipal: ...

  7. 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!

    写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...

  8. 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇

    ==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...

  9. 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之三 —— 配置

    ==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...

随机推荐

  1. Java基础——锁

    1.锁 当一个共享资源被多方访问时为了避免发生冲突而施加的一种机制 2.乐观锁和悲观锁 Java中锁在宏观分为乐观锁和悲观锁 乐观锁:是一种乐观思想,认为多读少写,一般情况下数据在修改时不会出现冲突, ...

  2. Centos-归档文件或目录-tar

    tar 对文件或者目录进行打包归档成一个文件,不是压缩 相关选项 -c 新建文件 -r 将目标文件追加都档案文件末尾 -t 列出归档文件中已经归档文件列表 -x 从归档文件中还原文件 -u 新文件更新 ...

  3. PADS Layout VX.2.3 修改层名

    操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 点击菜单Setup > Layer Definition... 在Layers Setup窗口中,选择相应的 ...

  4. #ifndef, #define, #endif三者的作用

    #ifndef, #define, #endif 作用   #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义.文件包含.条件编译) ...

  5. P2832 行路难

    题面 Link 题目背景 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述 山区有 \(n\) 座山.山之间有 \(m\) 条羊肠小道,每条连接两座山,只能单向通过, ...

  6. 《To B产品经理进阶》

    一.沙漏哟:To B产品技术标准化(全网独家) 经济机器是怎样运行的(超级简单模式理解经济运行规律) <俞军产品方法论>(思维模型.交易模型.经济学.心理学) <深度思考六步法> ...

  7. Docker 开启非认证的2375端口,提供外部访问 Docker

    1.编辑 Docker 服务的配置文件 vi /usr/lib/systemd/system/docker.service 或者 vi /lib/systemd/system/docker.servi ...

  8. 基于空镜像scratch创建一个新的Docker镜像

    我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像.优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包. 比如我机器上docke ...

  9. JavaScript实时显示当前时间

    1.HTML部分 <div id="div1">显示当前时间!</div> 2.css部分 #div1 { width: 700px; height: 50 ...

  10. 关于 ECMAScript、JavaScript、ES6、ECMAScript 2015

    ECMAScript 是一种规范,而 JavaScript 是对规范的实现.ECMA 是标准化组织. 最早的 JavaScript 是由 Netscape 公司开发的,并提交给 ECMA 标准化组织, ...