Skip to main content

Claim介绍

分类:  Asp.net Core认证和授权 标签:  #Asp.Net core基础 #认证 #.Net 发布于: 2023-05-27 18:57:15

我们前面一章聊了我们之前的认证是如何做的,基于Session和基于token的认证方式的不同,其中这里面都有一个用户登录之后,都需要在某些地方保存和用户相关的信息,例如用户的ID, 用户的用户名,用户邮件等等信息,在Session的时代是直接在服务器端保存这些信息,在使用token的时候,是保存token里。

 

那么在ASP.net Core中同样我们也是需要保存这些信息的,但是在ASP.net Core中对这些信息做了一些抽象。

 

为了理解这些抽象,我们先来看一个实际生活中的例子:

假如你需要去银行柜台存钱,你拿了钱到达了柜台之后,柜台需要确认你的身份,然后才能为你办理存钱的业务,你需要出示一些相关的证件来证明你就是你,证明了你是你本人之后才能将你和你的银行账户对应起来,这个时候柜台要求你拿出你的身份证,然后银行对你身份证上的信息进行验证,例如你的身份证号码,你身份证上的照片等等,确认这些无误之后,银行柜台确认你是叫XXX这个人,然后才会帮你办理业务。假如你的身份证没带,但是带了护照,这个时候你拿出了护照,银行柜台会根据护照上的号码,照片也能确认你本人,从而也可以达到办理业务的目的。

 

从这个实际的生活例子中,你拿出身份证或者护照给银行柜台进行验证就是一个认证的过程。

 

ASP.net Core对这个过程做了一些抽象,具体来说:

当你拿出身份证的时候,身份证上的每一项信息,例如身份证号码,姓名照片,这些信息每一项都是Claim(身份声明),那么包含这些信息的身份证就是一个ClaimIdentity(身份标识),然后由于你的这个身份标识(ClaimIdentity) 表示的就是你本人,那么你本人代表的就是一个ClaimPrinpcal 。

 

那么我们再来看一个了例子,例如护照的这个例子,护照上的号码,姓名等等都是Claim, 护照本身是ClaimIdentity,  ClaimIdentity都可以标识一个ClaimPrinpcal, 也就是你本人。

 

那么每次认证其实就是检查一个ClaimPrinpcal中是否存在一个ClaimIdentity已经经过了认证,假如是的,那么就是认证通过了。

 

我们以一个简单的例子来看一下这个过程,看下图的代码:

这个代码是使用ASP.netCore的CookieAuthencationSchema 来进行认证的:

从上述的图中可以看出,当用户提供的用户名和密码通过验证之后,我们首先先来构造各种Cliam(声明),然后使用这些声明构造一个ClaimIdentity,  然后再使用ClaimIdentity构造ClaimPrinpcal,  最后使用扩展方法进行SignIn(登入)

 

同时需要注意的是一个Prinpcal可以包含多个Identity, 例如你可以同时拥有身份证,护照,驾照,居住证,这些证中每一个都可以证明你的身份。每一个ClaimIdentity可以拥有多个Claim(声明)。

 

到这里,应该讲清楚了Claim的基础理论。