嗯,到这里,我们的身份证看起来似乎很完美了,但是从面向对象的角度来说好像还少了点什么东西? 对~,还是抽象,我们需要抽象出来一个接口来进行一些约束,约束什么呢?既然作为一个证件,那么肯定会涉及到这几个属性信息:
1、名字。2、类型。3、证件是否合法。
反应到接口里面的话就是如下,我们给接口取个名字叫:“身份(IIdentity)”:
这里延伸第二个知识点:IIdentity接口。
// 定义证件对象的基本功能。 public interface IIdentity { //证件名称 string Name { get; } // 用于标识证件的载体类型。 string AuthenticationType { get; } //是否是合法的证件。 bool IsAuthenticated { get; } }
所以我们的 ClaimsIdentity 最终看起来定义就是这样的了:
public class ClaimsIdentity : IIdentity { //...... }
ClaimsIdentity 介绍完毕,是不是发现也很简单,其他地方怎么翻译我不管,在本篇文章里面,它叫 “身份证”。
# 3: ClaimsPrincipal
有了身份证,我们就能证明我就是我了,有些时候一个人有很多张身份证,你猜这个人是干嘛的? 对,不是黄牛就是诈骗犯。
但是,有些时候一个人还有其他很多种身份,你猜这个人是干嘛的?这就很正常了对不对,比如你可以同时是一名教师,母亲,商人。如果你想证明你同时有这几种身份的时候,你可能需要出示教师证,你孩子的出生证,法人代表的营业执照证。
在程序中,一个身份证不仅仅代表你这个人了,而是代表一个身份,是证明你自己的主要身份哦。如果一个人还有其他很多种身份,这个时候就需要有一个东西(载体)来携带着这些证件了对吧?OK,我们给需要携带证件的这个对象取一个贴切点的名字,叫“证件当事人(ClaimsPrincipal)”吧。
以下是 Principal 这个单词在词典给出的解释,我用它你应该没意见吧:
principal ['prɪnsəpl]
adj. 主要的;资本的
n. 首长;校长;资本;当事人
这个时候可能有同学会问了,是不是应该叫ClaimsIdentityPrincipal比较好呢?嗯,我也觉得应该叫 ClaimsIdentityPrincipal 可能更好一点,或许微软的人偷懒了,简写成了ClaimsPrincipal。
知道其功能后,代码就很好写了,和上面ClaimsIdentity一样的套路:
public class ClaimsPrincipal { //把拥有的证件都给当事人 public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities){} //当事人的主身份呢 public virtual IIdentity Identity { get; } public virtual IEnumerable<ClaimsIdentity> Identities { get; } public virtual void AddIdentity(ClaimsIdentity identity); //为什么没有RemoveIdentity , 留给大家思考吧? }
当时人看起来也几乎完美了,但是我们还需要对其抽象一下,抽象哪些东西呢? 作为一个当事人,你应该有一个主身份吧,就是你的身份证咯,可能你还会用到角色(角色后面会详细介绍,这里你知道有这么个东西就行了)。
这里延伸第三个知识点:IPrincipal 接口。
public interface IPrincipal { //身份 IIdentity Identity { get; } //在否属于某个角色 bool IsInRole(string role); }
然后,我们的 证件当事人 看起来应该是这样的:
public class ClaimsPrincipal : IPrincipal { //... }
ClaimsPrincipal 介绍完了,也很简单吧? 其他地方怎么翻译我不管,在本篇文章里面,它叫 “证件当事人”。
想在,我们已经知道了 “证件单元(Claims)” , “身份证(ClaimsIdentity)” , “证件当事人(ClaimsPrincipal)”,并且整理清楚了他们之间的逻辑关系,趁热打铁,下面这个图是一个identity登入部分的不完全示意图,虚线圈出来的部分应该可以看懂了吧:
可以看出,首先我们在app这边有一些证件单元,然后调用ClaimsIdentity把证件单元初始化为一个身份证,然后再把身份证交给证件当事人由其保管。
才把 Getting Started 写完,发现已经这么长了,所以打算写成一个系列了,可能3 - 4篇吧。
总结
好了,本篇就先介绍到这里,在本篇博客中,我们学会了几个英文单词,并且知道了这些英文单词在程序中是扮演这怎么样一个对象。并且根据图我们知道了这些对象在整个认证系统种处在怎么样一个位置。 我发现如果想把 identity 讲清楚仅仅靠这一篇博客是不够的,下一篇我们将对.NET Authentication中间件进行抽丝剥茧,直到掌握.NET的整个认证系统后,我们再来看一下 Identiy 到底和 Entity Framework 有着怎样的爱恨情仇。