Asp.Net Core之Identity源码学习
什么是Identity
ASP.NET Identity是构建核心 Web 应用程序(ASP.NET、登录和用户数据)的成员系统。ASP.NET核心标识允许您向应用程序添加登录功能,并可以轻松自定义有关登录用户的数据。
源码链接 Github链接

用我的话说就是一个权限管理模块,可以提供使用ef持久化储存数据的功能。包含了用户管理,角色管理,用户凭证管理,角色凭证管理,以及各种第三方登录储存。
源码结构
源码主要包含一些接口定义,然后就是接口的封装,在这里我推荐一篇很不错的文章,比我讲的都要详细。
感觉不错的文章
我们来看看源码结构

Microsoft.Extensions.Identity.Stores 和 Microsoft.Extensions.Identity.Core里面的代码是重点 尤其是Microsoft.Extensions.Identity.Core里的那些定义的接口
- IQueryableRoleStore
- IQueryableUserStore
- IRoleClaimStore
- IRoleStore
- IUserAuthenticationTokenStore
- IUserClaimStore
- IUserEmailStore
- IUserLockoutStore
- IUserLoginStore
- IUserPasswordStore
- IUserPhoneNumberStore
- IUserRoleStore
- IUserSecurityStampStore
- IUserStore
- IUserTwoFactorStore
我们以IuserRoleStore接口为例

IUserRoleStore继承了IUserStore接口 好多接口都继承了IUserStore 因为这个是关于用户的最初的接口当其他的接口都继承这个的时候我们可以通过定义一个子类继承其他接口那我们就可以实现这些接口来实现具体的功能了
说到这我们就来看一个实现了功能的类

UserStoreBase这个抽象类算是继承了好多的接口 其中就包含IQueryableUserStore接口 这个接口算是为了查找数据定义的 因为这个接口就一个Users属性
另外的UserStore接口又继承了这个UserStoreBase接口

说着这里的实现其实到这里整个调用这些实现的方法就可以用了,把他们注入到DI容器然后就可以开心的使用了,如下图。官方就是这样操作的。但是可能涉及的接口比较多,源码里就把好多的操作接口给封装成那最经典的三个类了。

在UserStore里注入了Ef的数据上下文,也就是说对数据库的增删改查在UserStore里就已经完成了。

然后就是那最重要的三个类了这三个类算是对UserStore RoleStore那些功能再次封装了,这样在使用方面就注入这个三个类就可以实现所有的功能了。具体的功能大家看看涉及的源码细节。如果有看不懂的,请看我下面的动图示例演示代码,对理解源码有帮助。
SignInManager
UserManager
RoleManager

在源码里使用了很多的将IUserStore转换成其他子接口的使用方法,这大概是叫里氏替换原则吧。大家如果想实现一套自己的,可以定义好接口然后像identity这样实现接口,然后封装成这三个类就好了。或者封装成其他的什么类。这三个类是在图上的位置注入进入的。

关于权限系统的概念,我想做的系统是有三个概念,一个用户,一个角色,一个资源,这个资源可以是声明凭证,也可以是具体的权限,也可以是一些菜单的权限,其实和identity里的claim很像。用户可以拥有很多的角色,也可以拥有很多的资源,角色也可以拥有很多的资源,用户的总资源等于角色资源和用户资源的并集。
此文章算是学习笔记了,不喜欢的求轻喷。
Asp.Net Core之Identity源码学习的更多相关文章
- ASP.NET Core 2.1 源码学习之 Options[1]:Configure
配置的本质就是字符串的键值对,但是对于面向对象语言来说,能使用强类型的配置是何等的爽哉! 目录 ASP.NET Core 配置系统 强类型的 Options Configure 方法 Configur ...
- ASP.NET Core 2.1 源码学习之 Options[3]:IOptionsMonitor
前面我们讲到 IOptions 和 IOptionsSnapshot,他们两个最大的区别便是前者注册的是单例模式,后者注册的是 Scope 模式.而 IOptionsMonitor 则要求配置源必须是 ...
- ASP.NET Core 2.1 源码学习之 Options[3]:IOptionsMonitor 【转】
原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-ioptions-monitor-in-asp-net-core. ...
- ASP.NET Core 2.1 源码学习之 Options[1]:Configure 【转】
原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-configure-in-asp-net-core.html 配置 ...
- ASP.NET Core 选项模式源码学习Options Configure(一)
前言 ASP.NET Core 后我们的配置变得更加轻量级了,在ASP.NET Core中,配置模型得到了显著的扩展和增强,应用程序配置可以存储在多环境变量配置中,appsettings.json用户 ...
- ASP.NET Core 2.1 源码学习之 Options[2]:IOptions
在 上一章 中,介绍了Options的注册,而在使用时只需要注入 IOption<T> 即可: public ValuesController(IOptions<MyOptions& ...
- ASP.NET Core 2.1 源码学习之 Options[2]:IOptions 【转】
原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-ioptions-in-asp-net-core.html 在 上 ...
- ASP.NET Core 选项模式源码学习Options IOptions(二)
前言 上一篇文章介绍IOptions的注册,本章我们继续往下看 IOptions IOptions是一个接口里面只有一个Values属性,该接口通过OptionsManager实现 public in ...
- ASP.NET Core 选项模式源码学习Options IOptionsMonitor(三)
前言 IOptionsMonitor 是一种单一示例服务,可随时检索当前选项值,这在单一实例依赖项中尤其有用.IOptionsMonitor用于检索选项并管理TOption实例的选项通知, IOpti ...
- .NET Core 2.1 源码学习:看 SocketsHttpHandler 如何在异步方法中连接 Socket
在 .NET Core 2.1 中,System.Net.Sockets 的性能有了很大的提升,最好的证明是 Kestrel 与 HttpClient 都改为使用 System.Net.Sockets ...
随机推荐
- react this指向问题
在JSX事件函数方法中的 this,默认不会绑定 this指向.如果你忘记绑定,当你调用这个函数的时候 this 的值为 undefined.所以使用时一定要绑定好this的指向. 构造方法中绑定 c ...
- [Qt开发]当我们在开发兼容高分辨率和高缩放比、高DPI屏幕的软件时,我们在谈论什么。
前言 最近在开发有关高分辨率屏幕的软件,还是做了不少尝试的,当然我们也去网上查了不少资料,但是网上的资料也很零碎,说不明白,这样的话我就做个简单的总结,希望看到这的你可以一次解决你有关不同分辨率下的所 ...
- 剑指Offer-49.把字符串转换成整数(C++/Java)
题目: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的 ...
- VMware搭建集群环境
集群地址分配 名称 IP 子网掩码 网关 DNS flink01 192.168.22.211 255.255.255.0 192.168.22.2 114.114.114.114 flink02 1 ...
- k8s节点状态Init:0/1
k8s节点状态Init:0/1 在节点机器上打印日志: journalctl -f -u kubelet 出现以下内容: 5月 29 15:27:34 k8snode2 kubelet[2249]: ...
- redis主从复制篇
我们知道要避免单点故障,即保证高可用,便需要冗余(副本)方式提供集群服务. 而Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式. 主从复制概述 主从复制,是指将一台 ...
- XML文档定义的几种形式和本质区别
XML文档定义的形式 两种定义形式:DTD.Schema DTD:数据类型定义(Data Type Definition),用以描述XML文档的文档结构,是早期的XML文档定义形式. Schema:其 ...
- python重拾第十二天-MYSQL数据库
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql 1. 数据库介 ...
- nginx web服务器应用(虚拟主机 日志 rewrite location https)
Nginx介绍 Nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件,因具有高并发(特别是静态资源),占用系统资源少等特性,且功能丰富而逐渐流行起来.功能应用上,Nginx不但是一个优 ...
- Linux驱动中的等待队列与休眠
Linux驱动中的等待队列与休眠 原文:https://blog.csdn.net/mengluoxixiang/article/details/46239523?spm=1001.2014.3001 ...