Identity Core探索之旅(一)

前言

  本人是一名ASP.NET Core初学者,由于网上Identity的学习资源较少,微软官方文档又写的生涩难懂,相信不少初学者跟我一样不知道该从何学起,而本仓库的目的就是带领大家一起 学习探讨Identity,如有不正确的地方请指出。本项目将参考微软官方文档和Identity源码以及一些视频教程,从identity的使用到为什么这样使用,由浅入深地学习。(大佬请绕道谢谢~)

学习计划

  1. 了解基本概念
  2. 照葫芦画瓢
  3. 研究葫芦

1.了解基本概念

身份验证方案(Authentication scheme)

  举个例子,现在的小区基本都是封闭式的,如果不是户主都要身份登记才能进小区,而看守这个小区的警卫叔叔是怎么辨别要进来的人是不是户主呢?
  其实警卫叔叔本身没有辨别的能力,但是小区提供了一个神器叫“身份识别锁”给警卫叔叔,小区物业的人跟警卫叔叔说,你只需要让外来人进来时拿出一个XX钥匙放在这个“身份识别锁”上,这个锁会发出一个灯信号,如果灯变绿色,你就开门让外来人通过,如果灯变红色,你就登记一下告诉物业,让物业来处理,如果外来人没有这个钥匙,你就让它滚蛋登记为外来者再进入。通过“钥匙”和“锁”来进行身份验证,这就是一种身份验证方案,我们把这种方案叫做“XXX”方案。
  从代码层面上看,身份验证方案可以理解为是一个方案的名字。可以看下AuthenticationScheme构造函数的源码。

public AuthenticationScheme(string name, string? displayName, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type handlerType)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (handlerType == null)
            {
                throw new ArgumentNullException(nameof(handlerType));
            }
            if (!typeof(IAuthenticationHandler).IsAssignableFrom(handlerType))
            {
                throw new ArgumentException("handlerType must implement IAuthenticationHandler.");
            }

            Name = name;
            HandlerType = handlerType;
            DisplayName = displayName;
        }

  不过我不太理解这个HanderType是什么东东,有知道的童鞋可以帮忙解答下。

身份验证处理程序(Authentication handler)

  身份验证处理程序才是真正的核心,方案不过是个包装而已。那还是以上面那个例子为例,身份验证处理程序指的就是“钥匙”和“锁”怎么去处理各种情况,比如说在用户将“钥匙”放到“锁”上后,那么这个身份验证处理程序就开始工作了,它发动它的“验证”技能,假设这个技能是这样工作的:它读取出“钥匙”里的用户id信息然后发送到物业管理系统,让物业管理系统去数据库里寻找这个id是否存在,如果存在就返回true给“锁”,锁收到信息后显示绿色,如果找不到,或者id信息异常,就返回false,锁显示红色。当然,这个“锁”可能不止能验证是否为户主,还能验证是否是物业管理人员,这就要看处理程序是怎么写的了。
  从代码层面上讲,AuthenticationHandler继承自IAuthenticationHandler,而IAuthenticationHandler里只有四个方法声明分别是InitializeAsync,AuthenticateAsync,ChallengeAsync,ForbidAsync,分别对应初始化,验证,挑战,禁止。验证在我上面那个例子里讲过了,而挑战和禁止接下来就会讲到。

挑战和禁止(Challenge And Forbid)

  挑战就是当一个匿名用户尝试去访问一个页面,但这个页面要已经身份验证过的用户才能访问,那么处理程序就需要处理这种情况,例如跳转到登录页面。
  而禁止就是一个已经通过身份验证的用户去尝试访问一个页面,但这个页面需要更高的权限才能访问(比如说管理员),那么处理程序就需要处理这种情况,如跳转到一个页面提示用户访问受限。


warning:以下概念均与Claim有关

声明(Claim)

  其实我也不太清楚为什么要叫这个东西为Claim,简单的理解就是每个人都有自己的身份信息吧,比如说我,网名hlz2516,年龄24岁,职业程序员。把这些信息拆解成一个个单元,如网名是一个信息单元,它的键是网名,值是hlz2516,这一个信息单元就叫做Claim。Claim有两个属性,一个是Type,一个是Value,正好对应键和值,很好记吧。

声明类型(ClaimTypes)

  事先声明,这里的Claim我真的不知道该翻译成什么,所以我都会用Claim在正文中表示,标题的翻译可以无视。。
  ClaimTypes就是微软给我们提供的现成的一些Claim的键,比如名字,邮箱,角色等。这样就不用重复造轮子了~那么给个示例吧,怎样去new一个Claim:

var claim = new Claim(ClaimTypes.Name,"Alice");
//也可以自定义
var diyClaim = new Claim("feel","good');

基于声明的身份(ClaimsIdentity)

  "The ClaimsIdentity class is a concrete implementation of a claims-based identity; that is, an identity described by a collection of claims. "这是微软文档上的remark的第一句话,翻译过来意思就是:ClaimIdentity是基于Claims的Identity的具体实现,也就是说,一个identity由一组Claims描述。(lll¬ω¬),这样的翻译着实让人难受,简单来说就是一个Identity由一组Claims组成。然而,Identity到底是什么呢?Identity可以理解为这些Claims的一个载体,就像身份证是你身份信息的一个载体一样,我目前是这样理解的。
  ClaimsIdentity继承自接口IIdentity,这个接口通过微软文档我们可以知道,这个接口里包含三个属性:AuthenticationType,IsAuthenticated,Name。AuthenticationType表示Identity类型,或者说载体的类型,就像我们现在的多功能防盗门一样,它验证你是否为家庭成员的方式可以是通过钥匙,指纹,或者按键输入密码。

当事人(ClaimsPrincipal)

  ClaimsPrincial才是真正的那个“人”,它手持各种证(ClaimsIdentity),比如身份证这也是主要的证,驾驶证,结婚证,公司员工证等等一系列的证,每个证都是一个ClaimsIdentity,很好理解吧。
  其具体实现是继承了一个IPrincipal的接口,一个Principal对象表示在一个安全上下文中运行代码的用户,包括该用户的标识(IIdentity)及其所属的任何角色。所以该接口有一个IIdentity属性和一个IsInRole(string)方法。


  OK,基本概念到此就结束了,下一节我们还要再了解几个概念,然后进行实操演练,一起加油!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值