用例子看ASP.NET Core Identity是什么?
目录
@
前言
有三个重要的类claim, claimsidentity, claimsprincipal,我们以一个持有合法证件的学生bob做比方,claimsprincipal就是持有证件的学生bob,claimsidentity就是学生bob的证件驾照,claim就是bob驾照中的各种信息。
下边就开始围绕上边这段话展开描述:
基于声明的认证(claims-based authentication)
在开始学习标识管理系统(identity system)之前,很有必要搞清楚什么是基于声明的身份认证。
我们假设一个场景。bob是一名大学生,准备去银行为自己开户。银行工作人员需要bob提供他的有效证件,于是bob就把自己的驾照提供给了银行工作人员。银行工作人员可以从驾照上获取到bob的个人信息,例如姓名、出生日期和地址等。
bob希望能够享受到银行针对大学生的优惠政策,于是银行工作人员又请bob提供了学生证,同时从上边可以获取到姓名、所在的大学名称、院系以及学号等信息。(这里提供别人的学生证一定是不行的!)
使用以上生活中典型的应用场景,可以帮助我们进一步去理解基于声明(claims-based authentication)的身份认证。这个例子中bob拥有两个标识(identity,就相当于有效的身份证明,即证明你是你的那张纸,也就是identity):驾照+学生证。(当然还可以提供更多的identity,比如护照、户口本等等。)
好吧,我自己用文字越写越怕不明白,通过上边的这些文字,只需要清楚这么几点内容:
claim
- 就是一个键值对,例如:name:bob
-
claim可以是姓名、出身日期、地址、所在大学、学号等等信息
identity
- 很多条claim组成了一个identity
- identity就是一个有效的身份证明 = 证明你是你的那张纸 = 驾照、学生证等等
一个人可以拥有很多个identity
bob去开户,先提供了一个identity(这里就是驾照),接着又提供了一个identity(学生证)
清楚了这些,我们继续看
在asp.net core identity中是如何实现的
asp.net core 是开源的,这能够让我们非常方便的去学习和理解它是如何构成并运行的。源码可以。
可以把源码下载下来,然后查看源码,路径为:
corefx-master(解压后主文件夹)/src/system.security.claims/src/system/security
类claimsprincipal
一个用户(user)被声明成claimsprincipal类型(继承自iprincipal接口)。claimsprincipal类来自system.security.claims命名空间。
public class claimsprincipal : iprincipal { ........... ........... public virtual iidentity identity { get; } public virtual ienumerable<claimsidentity> identities { get; } public virtual ienumerable<claim> claims { get; } ........... ........... public virtual bool hasclaim(predicate<claim> match); public virtual bool hasclaim(string type, string value); public virtual bool isinrole(string role); ........... ........... }
从claimsprincipal类中可以看到有一个返回类型为claimsidentity集合的identities属性,代表着一个user可以拥有多个identity。
在这里的另外一个属性identity,不要被迷惑,他返回的是claimsprincipal中主要的(如果有多个)那一个claimidentity。
另外一个重要的属性claims,它返回了一个在claimsprincipal中所有的claimsidentity所包含得全部claims的集合。
考察另外一个重要的类claimsidentity
在这里还是要再次明确一下:
- claim就是一个键值对,用来描述一个特新,比如
姓名:bob
就是一个claim,生日:2009.9.15
这也是一个claim。其中姓名或生日就是这个claim的一种类型,即claimtype。 - 一组claim就构成了一个identity,具有这些claims的identity就是 claimsidentity ,也可以把claimsidentity理解为“证件”,驾照就是一种claimsidentity,学生证也是一种claimidentity。
- claimsidentity的持有者就是claimsprincipal ,一个claimsprincipal可以持有多个claimsidentity,就比如bob既持有驾照(claimidentity),又持有身份证(claimidentity)。
理解了claim, claimsidentity, claimsprincipal这三个概念,就能理解生成登录cookie为什么要用下面的代码?
... var claimsidentity = new claimsidentity(new claim[] { new claim(claimtypes.name, loginname) }, "basic"); var claimsprincipal = new claimsprincipal(claimsidentity); await context.authentication.signinasync(_cookieauthoptions.authenticationscheme, claimsprincipal); ...
要用cookie代表一个通过验证的主体,必须包含claim, claimsidentity, claimsprincipal这三个信息,以一个持有合法驾照的人做比方,claimsprincipal就是持有证件的人bob,claimsidentity就是证件驾照,"basic"就是证件类型(这里假设是驾照),claim就是驾照中的信息。
如果感觉困扰,可以再看下
这篇教程中,语言啰嗦之处还请见谅指证,因为自己在理解的时候花了不少时间,就怕解释不清说不清!