asp.net core 3.x 身份验证-1涉及到的概念

从本篇开始将围绕asp.net core身份验证写个小系列,希望你看完本系列后,脑子里对asp.net core的身份验证原理有个大致印象。
至于身份验证是啥?与授权有啥联系?就不介绍了,太啰嗦。你如果不晓得,自己去搜搜吧。
我的学习思路是详细看源码 > 总结得出一个宏观上的印象 + 如何使用。
如果发现有啥讲错的望指正,免得误导观众

我们偶尔会思考如何设计一个牛X的软件,其实通过对asp.net core框架本身的学习更划算,一来我们熟悉了asp.net core框架,再者我们学习了微软碰到需求是如何设计的。

计划:

基本介绍 - 概述 + 核心类介绍

基于cookie/session的身份验证原理 - 适合浏览器

基于Token身份验证 - 适合移动端app

集成第三方登录原理 - 比如集成微信、支付宝登录

IdentityServer - 目前不鸟解

asp.net core Identity - 目前不鸟解

必备知识:asp.net core、配置、选项、依赖注入、中间件等...

参考:源码、Artech、mvc5基于owin的身份验证视频

注意:本篇只讲涉及到的几个概念

 

身份验证方式和简易流程

常见的身份验证方式:

基于cookie/session的身份验证原理 - 适合浏览器

基于Token身份验证 - 适合移动端app

集成第三方登录原理 - 比如集成微信、支付宝登录

为了便于理解后续的概念,下面先以最常见的 用户密码+cookie的身份验证方式说说核心流程

登录:

用户输入账号密码提交

服务端验证账号密码

若验证成功,则创建一个包含用户标识的票证(下面会说)

将票证加密成字符串写入cookie

携带cookie请求:

用户发起请求

身份验证中间件尝试获取并解密cookie,进而得到含用户标识的票证(下面会说)

将用户标识设置到HttpContext.User属性

注意:若身份验证中间件即使没有解析得到用户标识,请求也会继续执行,此时以匿名用户的身份在访问系统

 

用户标识ClaimsPrincipal

它用来表示当前登录的用户,它包含用户Id + 一些与权限检查相关的附件属性(角色、所属部门)
当请求抵达时“身份验证中间件”将从请求中解析得到当前用户,如果获取成功则赋值给HttpContext.User属性

所以对于我们来说通常有两个场景使用它
在任意能访问HttpContext的地方获取当前用户,比如在Controller中。
如果需要自定义实现身份验证,则我们要想方设法从请求中解析得到用户,并赋值给HttpContext.User

现在你至少对用户标识这个概念有点理解了,如果要刨根问底儿就自行搜索关键字:asp.net Claims

也许你曾经做过或见过这样的设计,定义Employee表示当前系统的用户,当用户登录时会从数据库查询得到对应的Employee,若账号密码验证通过则将其放入Session或缓存中。下次访问时直接从Session/缓存中获取当前用户。个人觉得这种设计存在如下问题:

浪费内存:我们的业务代码访问当前用户最多的字段可能只是用户id,性别、地址、联系电话、学历....这些字段不是每个业务处理都需要的

抛弃了asp.net身份验证框架:从asp.net 2.0时代微软就设计了IPrincipal,后续的版本直到mvc5中基于owin的身份验证都在使用此接口,后续的权限验证微软也提供了,也是基于此接口的,但我们放弃了,反而是自己有写了一套微软本身就实现的功能,可能多数是觉得自己写的更简单。但我觉得判断哪种方式更合适是在你对两种方式都了解的情况下再做出判断。

 

用户票证AuthenticationTicket

既然有了上面的用户标识,何不直接在登录时加密这个标识,解析时直接解密得到呢?因为我们还需要额外的控制,比如过期时间,这个属性只是在身份验证阶段来判断是否过期,在我们(如Controller.Action中)使用用户标识的时候并不需要此字段,类似的额外字段根据不同的身份验证方式可能有很多,因此定义了“用户票证”这个概念,它包含 用户标识 + 身份验证过程中需要的额外属性(如得到用户标识的时间、过期时间等)

 

身份验证处理器AuthenticationHandler

参考上面的用户名密码+cookie身份验证流程我们发现有几个核心的处理步骤:

在登录时验证通过后将用户标识加密后存储到cookie,SignIn

当用户注销时,需要清楚代表用户标识的cookie,SignOut

在登录时从请求中获取用户标识,Authenticate

在用户未登录访问受保护的资源时,我们希望跳转到到登录页,Challenge

Challenge叫做质询/挑战,意思是当发现没有从当前请求中发现用户标识是希望怎么办,可能是跳转到登录页,也可能是直接响应401,或者跳转到第三方(如QQ、微信)的登录页 

因为某种原因(如权限验证不过),阻止方案,Forbid

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygjpy.html