媒介
在 ASP.NET Core 中,依然沿用了 ASP.NET内里的 Identity 组件库,担任对用户的身份举行认证,整体来讲的话,没有MVC 5 内里那末庞杂,因为在MVC 5内里引入了OWIN的东西,所以许多初学者在进修来很费力,关于 Identity 都是一头雾水,包含我也是,曾在学 identity 这个东西前后花了一个多月来搞懂内里的道理。所以大部份开发者关于 Identity 并没有爱,也并没有运用它,会以为被绑架。
值得光荣的是,在 ASP.NET Core 中,因为对模块的笼统化逐步清晰,以及中间件的运用,这使得 Identity 的进修和运用线路变得越发平易近民,下面就让我们一同来看看吧。
Getting Started
在最先之前,让我们先遗忘它和Entity Framework
的关联,也遗忘它和Authentication
的关联,我们先进修几个英语单词。
有这么几个“单词”你可以须要弄邃晓:
# 1: Claims
人人应当都晓得身份证长什么模样的,以下:
个中,姓名:奥巴马;性别:男;民族:肯尼亚;诞生:1961.08.04,等等这些身份信息,可以看出都是一个一个的键值对,那假如我们想在顺序中存这些东西,如何来设想呢?对,你可以想到了运用一个字典举行存储,一个Key,一个Value恰好满足需求。然则Key,Value的话觉得不太友爱,不太面向对象,所以假如我们做成一个对象的话,是不是是更好一些呢?最起码你可以用vs的智能提醒了吧,我们修正一下,改成下面如许:
//我给对象取一个名字叫`Claim`你没有看法吧 public class Claim { public string ClaimType { get; set; } public string ClaimValue { get; set; } }
ClaimType 就是Key,ClaimValue就代表一个Value。如许的话,恰好可以存储一个键值对。这时刻姓名:奥巴马
是不是是可以存进去了。
微软的人很知心,给我们预备了一些默许的ClaimType
呢?许多经常使用的都在内里呢,一同看看吧:
这里延长第一个知识点:ClaimTypes
为了浏览体验,截图我只放了一部份哦。可以看到有什么Name,Email,Gender,MobilePhone等经常使用的都已有了,其他的另有许多。仔细的读者可以注重了,它的定名空间是System.Security.Claims
,那就申明这个东西是.net 框架的一部份,嗯,我们临时只须要晓得这么多就OK了。
Claim 引见终了,是不是是很简单,其他地方如何翻译我不论,在本篇文章内里,它叫 “证件单位”。
# 2: ClaimsIdentity
在有了“证件单位”以后,我们就用它可以制作一张身份证了,那末应当如何制作呢?有些同砚可以已想到了,对,就是新建一个对象,然后在组织函数内里把身份证单位传输进去,然后就获得一张身份证了。我们给这张身份证取一个英文名字叫 “ClaimsIdentity”,这个名字看起来还蛮相符的,既有 Claims 示意其组成部份,又有示意其用处的 Identity(身份),很惬意的一个名字。
实际上,在现实生活中,我们的身份证有一部份信息是隐蔽的,有一部份是可以直接看到的。比方新一代的身份证内里存储了你的指纹信息你是看不到的,这些都存储在身份证内里的芯片中,那能看到的比方姓名啊,岁数啊等。我们在设想一个对象的时刻也是一样,须要暴露出来一些东西,那这里我们的 ClaimsIdentity 就暴露出来一个 Name,Lable等。
我们造的身份证(ClaimsIdentity)另有一个重要的属性就是范例(AuthenticationType),等等,AuthenticationType是什么东西?看起来有点眼熟的模样。我们晓得我们本身的身份证是干吗的吧,就是用来证实我们的身份的,在你证实身份出示它的时刻,实在它有许多种情势载体的,什么意思呢?比方你可以直接拿出实体情势的身份证,那也可以是纸张情势的复印件,也可以是电子情势的电子码等等,这个时刻就须要有一个可以示意其存在情势的范例字段,对,这个AuthenticationType就是干这个事变的。
然后我们在给我们的身份证增加一些润饰,让其看起来悦目,比方供应一些要领增加 Claims 的,删除 Claims的,写到二进制流内里的啊等等,终究我们的身份证对象看起来基本上是如许了:
public class ClaimsIdentity { public ClaimsIdentity(IEnumerable<Claim> claims){} //名字这么重要,固然不能让他人随意改啊,所以我不准 set,除了我儿子跟我姓,所所以 virtual 的 public virtual string Name { get; } public string Label { get; set; } //这是我的证件范例,也很重要,一样不准 set public virtual string AuthenticationType { get; } public virtual void AddClaim(Claim claim); public virtual void RemoveClaim(Claim claim); public virtual void FindClaim(Claim claim); }
嗯,到这里,我们的身份证看起来彷佛很完美了,然则从面向对象的角度来讲彷佛还少了点什么东西? 对~,照样笼统,我们须要笼统出来一个接口来举行一些束缚,束缚什么呢?既然作为一个证件,那末肯定会涉及到这几个属性信息:
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 有着如何的爱恨情仇。
这仅仅是一个最先,人人假如以为本篇博客对您有协助的话,感谢您的【引荐】,假如你对 .NET Core 感兴趣可以关注我,我会按期在博客分享关于 .NET Core 的进修心得。
以上就是ASP.NET Core 之 Identity入门的细致内容,更多请关注ki4网别的相干文章!