今天我们来学习ASP.netCore的认证。
在学习ASP.net Core的认证之前,我们先需要理解一些最为基本的概念。
我们来结合一些日常的生活例子,但是同时请保持一些计算机系统的基础理念来考虑问题。
什么是认证?
认证就是应用或者系统对于来自用户访问需要被保护资源的一个身份的判定过程,日常生活中其实也有很多的实际例子,例如说你到公司上班,保安处的同事需要看你的工牌,或者你需要刷门禁卡进入公司,这些都是属于认证的日常表现,也是实际的应用场景。那么这里有一个有趣的问题,登录系统这个动作是认证吗?并不是,就像进入公司保安问你要工牌,你去包里拿工牌这个动作并不是认证,这个动作只能是算是登录。认证是一个鉴定身份的动作。
那么什么是认证系统?认证系统需要由哪些动作来完成呢?
还是拿之前我们的那个日常生活中的例子来学习一下,进入公司保安需要对每位同事进行认证,只有被认证了的同事才会被允许进入公司。那么我们分解一下这个过程:
SignIn:首先你需要拿出你的工牌,这个动作对应什么?是不是我们应用系统中的登录?例如需要登陆你需要提供有效的信息,AccessToken, Cookie里带的身份信息,或者你的用户名密码,我们这里是什么?那就是你的工牌。
Challenge: 好了,工牌有了,你拿工牌给保安看,结果由于你包里有很多卡,拿错了工牌,保安会怎么样?保安肯定会要你重新拿一次,拿到正确的工牌,那么这个场景叫什么?在计算机系统中这个就叫做Challenge, 保安对你拿错了工牌这件事发起了challenge,要求你重新拿。
Authenticate: 好了,继续,然后你拿到了正确的工牌,保安核对无误,保安核对的这个动作,对应我们认证系统中就叫我们认证Authenticate。
Forbid:一切正常的情况下你就可以被允许放行了,不过假如这个时候因为新冠疫情,你不能出示绿色的健康码,虽然你工牌是对的,但是这个时候保安还是拒绝你进入公司,这个动作是什么?这个动作在认证系统中有一个专有的名词,叫:Forbid。
Identity& Claimcipal: 好了,我们不考虑Forbid, 你成功的进入公司了,你的工牌成为了你的身份标识,我们叫Identity, 同时你的工牌集中有你的基本信息,例如你的Alias,你的部门,你的姓名,你的照片等等,那这个我们就称为ClaimPrincipal。
SignOut: 结束了一天的工作,打开下班,离开公司,那么这个就是SignOut。
好了,那么大家现在理解了一个认证系统有哪些动作以及由哪些信息组成了么?
这里引申出来另外一个问题:Challenge和Forbid有什么不同呢?Challenge是针对一个未认证成功发出来的动作,Forbid是认证成功了,但是没有权限访问,所以是Forbid.
ASP.net Core的认证基本原理
好了我们前面介绍完了一个认证系统的基本概念了,现在来看在ASP.net Core中是如何对这样一个实际应用的场景进行建模的。
开始之前我们先需要再回顾一下ASP.netCore这个框架的一些基本概念:Service(服务)和 middleware (中间件), Service(服务实际上是通过ASP.net Core框架提供的DI服务,将需要某些应用范围中要使用的类注册进入到DI容器中,而MiddleWare(中间件)则是我们在处理一个用户请求的流水线中设计的一系列的管道。大致的意思如下:
因此处理认证在ASP.netCore中也是需要在这个框架下进行处理,认证服务注册为一个Service,然后在安装一个认证的中间件,由中间件调用认证服务(Service)来完成整个认证系统。
ASP.net Core的认证服务(Service)
ASP.net Core的认证服务是通过实现接口:IAuthenticationService来实现的,关于这个接口的详细信息,您可以参考以下文档:
https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.iauthenticationservice?view=aspnetcore-5.0
从该文档可以很容看出,IAuthenticationService规定服务实现必须完成上述我们讨论的一个认证系统需要完成的动作,如下图:
SignIn, SignOut, Authencicate, Challenge, Forbid这些都是认证系统中标准的动作。
ASP.net Core中已有的对IAuthenticationService的实现
同时我们需要注意的是,这个只是一个接口,要想注册任何一个实际的服务,那么就是必须实现这个接口同时要实现这些方法,ASP.net Core 框架中已经实现好的这些服务有专有的名字,AuthenticagtionSchema. (或者是AuthenticateHandler), 这个就做两件事,实现服务中的方法,同时根据不同的实现配置不同的选项,例如基于Cookike的实现,基于JwtToken的实现等等,我们前面也讨论过了,我们先要注册服务,如下图:在Startup.ConfigureService方法中注册。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options=> Configuration.Bind("CookieSettings", options));
我们这里使用JwtBearerDefaults.AuthencationSchema作为默认的认证模式,同时加入了多个认证的Schema.这里一个是jwt token,另外一个是cookie,(注意这里都是使用的扩展方法进行注册)。
如何启用认证中间件
这个就简单了,需要在Startup.Configure方法中直接调用中间件的扩展方法就好了。
这里需要注意的是启用该中间件方法的顺序,必须是在处理好路由之后,在定义访问endpoint之前。
好了,关于ASP.netCore中的认证系统基本概念我们就讲完了,随后我们会一点一点的讲解ASP.net Core中提供的认证解决方案。
希望大家加强学习哈。
领取专属 10元无门槛券
私享最新 技术干货