ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:24.29KB ,
资源ID:3461453      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3461453.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ASP NET Core 之 Identity 入门.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ASP NET Core 之 Identity 入门.docx

1、ASP NET Core 之 Identity 入门ASP.NET Core 之 Identity 入门前言在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OWIN的东西,所以很多初学者在学习来很费劲,对于 Identity 都是一头雾水,包括我也是,曾经在学 identity 这个东西前后花了一个多月来搞懂里面的原理。所以大部分开发者对于 Identity 并没有爱,也并没有使用它,会觉得被绑架。值得庆幸的是,在 ASP.NET Core 中,由于对模

2、块的抽象化逐渐清晰,以及中间件的使用,这使得 Identity 的学习和使用路线变得更加平易近人,下面就让我们一起来看看吧。Getting Started在开始之前,让我们先忘记它和Entity Framework的关系,也忘记它和Authentication的关系,我们先学习几个英语单词。有这么几个“单词”你可能需要弄明白:# 1: Claims大家应该都知道身份证长什么样子的,如下:其中,姓名:奥巴马;性别:男;民族:肯尼亚;出生:1961.08.04,等等这些身份信息,可以看出都是一个一个的键值对,那如果我们想在程序中存这些东西,怎么样来设计呢?对,你可能想到了使用一个字典进行存储,一个

3、Key,一个Value刚好满足需求。但是Key,Value的话感觉不太友好,不太面向对象,所以如果我们做成一个对象的话,是不是更好一些呢?最起码你可以用vs的智能提示了吧,我们修改一下,改成下面这样:/我给对象取一个名字叫Claim你没有意见吧public class Claim public string ClaimType get; set; public string ClaimValue get; set; ClaimType 就是Key,ClaimValue就代表一个Value。这样的话,刚好可以存储一个键值对。这时候姓名:奥巴马是不是可以存进去了。微软的人很贴心,给我们准备了一些默

4、认的ClaimType呢?很多常用的都在里面呢,一起看看吧:这里延伸第一个知识点:ClaimTypes为了阅读体验,截图我只放了一部分哦。可以看到有什么Name,Email,Gender,MobilePhone等常用的都已经有了,其他的还有很多。细心的读者可能注意了,它的命名空间是System.Security.Claims,那就说明这个东西是.net 框架的一部分,嗯,我们暂时只需要知道这么多就OK了。Claim 介绍完毕,是不是很简单,其他地方怎么翻译我不管,在本篇文章里面,它叫 “证件单元”。# 2: ClaimsIdentity在有了“证件单元”之后,我们就用它可以制造一张身份证了,那

5、么应该怎么样制造呢?有些同学可能已经想到了,对,就是新建一个对象,然后在构造函数里面把身份证单元传输进去,然后就得到一张身份证了。我们给这张身份证取一个英文名字叫 “ClaimsIdentity”,这个名字看起来还蛮符合的,既有 Claims 表示其组成部分,又有表示其用途的 Identity(身份),很满意的一个名字。实际上,在现实生活中,我们的身份证有一部分信息是隐藏的,有一部分是可以直接看到的。比如新一代的身份证里面存储了你的指纹信息你是看不到的,这些都存储在身份证里面的芯片中,那能看到的比如姓名啊,年龄啊等。我们在设计一个对象的时候也是一样,需要暴露出来一些东西,那这里我们的 Clai

6、msIdentity 就暴露出来一个 Name,Lable等。我们造的身份证(ClaimsIdentity)还有一个重要的属性就是类型(AuthenticationType),等等,AuthenticationType是什么东西?看起来有点眼熟的样子。我们知道我们自己的身份证是干嘛的吧,就是用来证明我们的身份的,在你证明身份出示它的时候,其实它有很多种形式载体的,什么意思呢?比如你可以直接拿出实体形式的身份证,那也可以是纸张形式的复印件,也可以是电子形式的电子码等等,这个时候就需要有一个能够表示其存在形式的类型字段,对,这个AuthenticationType就是干这个事情的。然后我们在给我们

7、的身份证添加一些润色,让其看起来好看,比如提供一些方法添加 Claims 的,删除 Claims的,写到二进制流里面的啊等等,最终我们的身份证对象看起来基本上是这样了:public class ClaimsIdentity public ClaimsIdentity(IEnumerable claims) /名字这么重要,当然不能让别人随便改啊,所以我不许 set,除了我儿子跟我姓,所以是 virtual 的 public virtual string Name get; public string Label get; set; /这是我的证件类型,也很重要,同样不许 set public

8、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、证件是否合法。反应到接口里

9、面的话就是如下,我们给接口取个名字叫:“身份(IIdentity)”:这里延伸第二个知识点:IIdentity接口。/ 定义证件对象的基本功能。public interface IIdentity /证件名称 string Name get; / 用于标识证件的载体类型。 string AuthenticationType get; /是否是合法的证件。 bool IsAuthenticated get; 所以我们的 ClaimsIdentity 最终看起来定义就是这样的了:public class ClaimsIdentity : IIdentity /.ClaimsIdentity 介绍完

10、毕,是不是发现也很简单,其他地方怎么翻译我不管,在本篇文章里面,它叫 “身份证”。# 3: ClaimsPrincipal有了身份证,我们就能证明我就是我了,有些时候一个人有很多张身份证,你猜这个人是干嘛的? 对,不是黄牛就是诈骗犯。但是,有些时候一个人还有其他很多种身份,你猜这个人是干嘛的?这就很正常了对不对,比如你可以同时是一名教师,母亲,商人。如果你想证明你同时有这几种身份的时候,你可能需要出示教师证,你孩子的出生证,法人代表的营业执照证。在程序中,一个身份证不仅仅代表你这个人了,而是代表一个身份,是证明你自己的主要身份哦。如果一个人还有其他很多种身份,这个时候就需要有一个东西(载体)来

11、携带着这些证件了对吧?OK,我们给需要携带证件的这个对象取一个贴切点的名字,叫“证件当事人(ClaimsPrincipal)”吧。以下是 Principal 这个单词在词典给出的解释,我用它你应该没意见吧:principal prnspl adj. 主要的;资本的n. 首长;校长;资本;当事人这个时候可能有同学会问了,是不是应该叫ClaimsIdentityPrincipal比较好呢?嗯,我也觉得应该叫 ClaimsIdentityPrincipal 可能更好一点,或许微软的人偷懒了,简写成了ClaimsPrincipal。知道其功能后,代码就很好写了,和上面ClaimsIdentity一样的

12、套路:public class ClaimsPrincipal /把拥有的证件都给当事人 public ClaimsPrincipal(IEnumerable identities) /当事人的主身份呢 public virtual IIdentity Identity get; public virtual IEnumerable Identities get; public virtual void AddIdentity(ClaimsIdentity identity); /为什么没有RemoveIdentity , 留给大家思考吧?当时人看起来也几乎完美了,但是我们还需要对其抽象一下,

13、抽象哪些东西呢? 作为一个当事人,你应该有一个主身份吧,就是你的身份证咯,可能你还会用到角色(角色后面会详细介绍,这里你知道有这么个东西就行了)。这里延伸第三个知识点:IPrincipal 接口。public interface IPrincipal /身份 IIdentity Identity get; /在否属于某个角色 bool IsInRole(string role);然后,我们的 证件当事人 看起来应该是这样的:public class ClaimsPrincipal : IPrincipal /.ClaimsPrincipal 介绍完了,也很简单吧? 其他地方怎么翻译我不管,在本

14、篇文章里面,它叫 “证件当事人”。想在,我们已经知道了 “证件单元(Claims)” , “身份证(ClaimsIdentity)” , “证件当事人(ClaimsPrincipal)”,并且整理清楚了他们之间的逻辑关系,趁热打铁,下面这个图是一个identity登入部分的不完全示意图,虚线圈出来的部分应该可以看懂了吧:可以看出,首先我们在app这边有一些证件单元,然后调用ClaimsIdentity把证件单元初始化为一个身份证,然后再把身份证交给证件当事人由其保管。才把 Getting Started 写完,发现已经这么长了,所以打算写成一个系列了,可能3 - 4篇吧。总结好了,本篇就先介绍

15、到这里,在本篇博客中,我们学会了几个英文单词,并且知道了这些英文单词在程序中是扮演这怎么样一个对象。并且根据图我们知道了这些对象在整个认证系统种处在怎么样一个位置。 我发现如果想把 identity 讲清楚仅仅靠这一篇博客是不够的,下一篇我们将对.NET Authentication中间件进行抽丝剥茧,直到掌握.NET的整个认证系统后,我们再来看一下 Identiy 到底和 Entity Framework 有着怎样的爱恨情仇。这仅仅是一个开始,大家如果觉得本篇博客对您有帮助的话,感谢您的【推荐】,如果你对 .NET Core 感兴趣可以关注我,我会定期在博客分享关于 .NET Core 的学

16、习心得。在 上篇文章 中讲了关于 Identity 需要了解的单词以及相对应的几个知识点,并且知道了Identity处在整个登入流程中的位置,本篇主要是在 .NET 整个认证系统中比较重要的一个环节,就是 认证(Authentication),因为想要把 Identity 讲清楚,是绕不过 Authentication 的。在之前写过一篇关于 ASP.NET Core 中间件的文章,里面有一部分(怎么样自定义自己的中间件)是具体关于认证系统的一个具体使用,有兴趣的朋友可以看一下这篇文章。其实 Identity 也是认证系统的一个具体使用,大家一定要把 Authentication 和 Iden

17、tity 当作是两个东西,一旦混淆,你就容易陷入进去。下面就来说一下 ASP.NET Core 中的认证系统是怎么样一回事。不要怕,其实很简单,全是干货Getting Started大家应该还记得在上一篇中的奥巴马先生吧,他现在不住在华盛顿了,他到中国来旅游了,现在住在北京,这几天听说西湖风景不错,于是在 12306 定了一张北京到杭州的高铁票。取到票之后,他向我们展示了一下:今天是11.11号,奥巴马很开心,原因你懂的。快到出发的时间了,于是,拿着票走到了火车站检票口,刚把身份证和火车票递给检票员。“cut”,导演喊了一声。尼玛原来是在拍电影呢导演说:奥巴马,你演的太烂了,别演了,你来演检票

18、员吧,让旁边小李来演要出行路由的奥巴马吧。奥巴马不情愿的说了一声:“好吧,希望小李能够受的了你”。“action”,导演又喊了一声,故事开始了AuthenticationManager奥巴马当了检票员以后,特别高兴,因为他有权利了呀,他可以控制别人能不能上车了,说不定还能偷偷放几个人进去捞点外快呢。得知了他能干什么以后,他觉得检票员这个名字简直太 low 了,很快,他就有了一个新的高大上的名字,叫:认证管理员(AuthenticationManager),而且,他觉得他自己应该处在整个核心位置,为什么呢?你想想看,那么庞大的一套铁路载人系统,能不能有收入有钱赚,全靠他给不给放人进去,如果一个人

19、都不放进去,另外那一大帮人只能去喝西北风了。到这里,聪明的同学可能已经知道奥巴马把他自己放在怎么样一个核心位置了。对,他把自己放到了 HttpContext 里面。怎么样? 够核心吧。这里延伸第一个知识点:AuthenticationManager 所处的位置有同学在上面的截图里面发现了 public abstract ClaimsPrincipal User get; set; , 这不就是我们上一篇中讲到的 “ 证件当事人 ” ,现在小李扮演的那个角色么? 对,这个 User 就是本文中的小李,被你提前发现他躲着这里了,嘿嘿。还有一个知识点,就是 AuthenticationScheme,

20、什么意思呢? 且看奥巴马敢把自己放在这么核心的位置也是有他的能力的,怎么讲呢? 比如说在检票的时候,别人递过来一张身份证和一张火车票,那怎么样验证这两个证件是合法的呢? 以下就是奥巴马提出的针对两种证件的验证方案:方案1、针对身份证的验证,可以查看其本人是否和身份证头像是否一致,年龄是否符合当事人具体年龄。方案2、针对火车票的验证,可以看车次,时间是否符合发车目标,另外可以看车票上的身份号码是否和身份证一致。其中,这每一种方案,就对应一个 AuthenticationScheme(验证方案名称),是不是明白了。这就是第二个知识点 AuthenticationScheme 很重要。知道了奥巴马的

21、职责后,就很容易的把代码写出来了:public abstract class AuthenticationManager /AuthenticateContext包含了需要认证的上下文,里面就有小李 public abstract Task AuthenticateAsync(AuthenticateContext context); /握手 public abstract Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavio

22、r); /登入 public abstract Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); /登出 public abstract Task SignOutAsync(string authenticationScheme, AtionProperties properties);奥巴马做为一个检票员,有一个认证方法,AuthenticateAsync() ,注意这是其一个核心功能,其他几个都可以没有,但是唯独不能没有

23、这个功能,没有的话他就不能称之为一个检票员了。然后还有一个握手ChallengeAsync,登入SignInAsync和登出SignOutAsync,下面说说笔者对这三个方法的理解吧。ChallengeAsync:是社区协议文件 RFC2167 定义的关于在HTTP Authentication 过程中的一种关于握手的一个过程,主要是摘要认证(digest authentication),更多信息查看这里。是不是有点专业,看不懂,没事,有通俗版本的。 小李要进站了,这个时候小李问了一下我们的检票员奥巴马先生。小李:“你好,检票员,我可以进站吗?”检票员奥巴马:“要赶火车吗?可以啊,请出示你的证

24、件?”小李:“好的,这是我的证件,你检查一下?”检票员奥巴马:“嗯,证件没问题,进去吧”这样一个过程就是握手(digest-challenge)或者叫问答的一个过程,明白了 ChallengeAsync 的原理了吧? 是不是很简单。SignInAsync,SignOutAsync:个人觉得这两个不应该放在这里,因为并不属于认证的职责,也不属于协议规定的内容。但是这两个方法确实需要抽象,应该单独抽取一个接口存放,至于为什么这样做,或许是因为以下原因:1、对登入登出的抽象是和认证紧密结合的,大多数情况下认证资料的保存是需要在SignIn进行的,比如 Cookies Authentication 中

25、间件就在SignIn方法里面做了Cookie的保存。2、 AuthenticationManager 这个对象是处在 HttpContext上下文里面的,本着面向抽象和封装的原则,放到其里面是合适的,这样能够很方便的用户对其调用。关于 AuthenticationManager 已经介绍完了,是不是很简单呢?IAuthenticationHandler有些同学可能会问了,如果 AuthenticationManager 不提供接口的话,只是一个抽象类的话,那如果自定义认证方法就必须继承它,这对于开发者来说是不友好的,也违背了面向接口编程的理念。嗯,确实是这样,那么接口来了:public int

26、erface IAuthenticationHandler void GetDescriptions(DescribeSchemesContext context); Task AuthenticateAsync(AuthenticateContext context); Task ChallengeAsync(ChallengeContext context); Task SignInAsync(SignInContext context); Task SignOutAsync(SignOutContext context);这个接口是在 AuthenticationManager 实现类

27、DefaultAuthenticationManager 中延伸出来的,所以大家不用再去看里面的源码了,记住以后如果需要重写认证相关的东西,实现IAtionHandler就可以了。Authentication 中间件对 IAuthenticationHandler 的初步实现,封装了 AuthenticationHandler 这个抽象类,把具体的核心功能都交给下游去实现了,下面的CookieAuthentication 中间件核心类 CookieAuthenticationHandler 就是继承自AuthenticationHandler, 知道这么多就够了。CookieAuthentic

28、ation 中间件故事还要继续,奥巴马在接到小李递来的身份证和火车票之后,首先拿着火车票在一个二维码机器上扫描了一下,然后又拿着身份证在一个机器上刷了一下,经过核查,发现都没有问题。于是拿起印章在上面盖了一个 “ 验讫 ”。这中间都发生了什么呢?首先,在二维码扫描的过程,这个过程二维码机器会解析你火车票上的二维码,如果发现解析失败,会直接响应认证失败。也就是你别想进站了。如果解析成功,就会得到你这个票据中的信息了,然后拿到你票据里面的的当事人信息进行验证是否被列为了铁路局黑名单中。如果验证通过,则会给你颁发一个识别码,把符合你身份的一个识别码写入到你的火车票中和检票员旁边的电脑系统中,即 “

29、验讫 ”。话说这个验讫有点高级,它会向你的火车票芯片中写入一些信息,那么都写入些什么信息呢? 1、奥巴马个人的信息。2、验证途中的一些上下信息。3、使用的验证方案。知道了,这些之后,那么就很容易实现这个验证方法了,对吧? 以下是 CookieAuthentication 中间件中的核心类 CookieAuthenticationHandler 的里面的核心方法HandleAuthenticateAsync(),同样你可以理解为实现的 IAuthenticationHandler 接口的 AuthenticateAsync:protected override async Task Handle

30、AuthenticateAsync() / 解析二维码 var result = await EnsureCookieTicket(); if (!result.Succeeded) return result; / 从二维码中拿当事人信息进行验证 var context = new CookieValidatePrincipalContext(Context, result.Ticket, Options); await Options.Events.ValidatePrincipal(context); if (context.Principal = null) return Authen

31、ticateResult.Fail(No principal.); if (context.ShouldRenew) RequestRefresh(result.Ticket); / 验讫, 写入芯片 return AuthenticateResult.Success(new AuthenticationTicket(context.Principal, context.Properties, Options.AuthenticationScheme);HandleSignInAsync我们故事继续奥巴马检票完成之后,把票就交给了小李,小李拿到票之后,导演又喊了一声:“ cut ”怎么又停了,小李和奥巴马一肚子的疑

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1